2013-06-06 43 views
0

我試圖使用JSlider來設置三個JTextField中的文本。 我的條件是滑塊應該爲textfield_1工作,只有當textfield_1獲得其焦點時,類似地爲其他兩個文本域。 當我試圖在其他文本字段中使用相同的滑塊時,只有第一個文本字段值被更改。是否有可能使用JSlider控制多個JTextfield?

期待寶貴的建議在此先感謝。

JSlider slider; 
JTextField tf; 


tf.addFocusListener(new FoucusListener(){ 
public void foucusGained(FocusEvent fe){ 
    slider.addChangeListener(new ChangeListener()){ 
public void stateChanged(ChangeEvent ce){ 
    JSlider slider =(JSlider)ce.getSource(); 
    if(slider.getValueisAdjusting()) 
     tf.setText(String.valueOf(slider.getValue())) 
    } 
}); 
}); 
+0

什麼理由來控制從JSlider的3個JTextFieds,也許有更好的辦法,否則你看看BoundedRangeModel, – mKorbel

+0

@mKorbel謝謝,我知道一個單獨的滑塊可以使它工作,但我覺得添加更多的滑塊會損壞設計 –

+1

文本字段的目的是什麼?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

1

最基本的想法是你需要知道最後選擇了哪個字段。問題是,當你選擇滑塊時,它將激發獲得焦點的事件...

最簡單的想法是使用僅註冊到文本字段的FocusListener並保持對所選最後一個字段的引用。

當滑塊改變,你會簡單地用最後選定的磁場相互作用(如果它不是null

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class SliderControl { 

    public static void main(String[] args) { 
     new SliderControl(); 
    } 

    public SliderControl() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JSlider slider; 
     private JTextField[] fields; 

     private JTextField selectedField; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      fields = new JTextField[3]; 
      FocusHandler focusHandler = new FocusHandler(); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      for (int index = 0; index < 3; index++) { 
       fields[index] = new JTextField(3); 
       fields[index].addFocusListener(focusHandler); 
       add(fields[index], gbc); 
       gbc.gridy++; 
      } 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      slider = new JSlider(); 
      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        if (selectedField != null) { 
         selectedField.setText(String.valueOf(slider.getValue())); 
        } 
       } 
      }); 
      add(slider, gbc); 
     } 

     protected class FocusHandler extends FocusAdapter { 

      @Override 
      public void focusGained(FocusEvent e) { 
       if (e.getComponent() instanceof JTextField) { 
        selectedField = (JTextField) e.getComponent(); 
       } 
      } 

     } 
    } 
} 
+0

非常感謝您。 –

相關問題