2013-06-06 30 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

非常感谢您。 –

相关问题