2013-06-06 2 views
0

Я попытался использовать JSlider для установки текста в трех JTextFields. Мое условие - ползунок должен работать для textfield_1, только когда textfield_1 получает фокус, аналогично для двух других текстовых полей. Когда я попытался использовать тот же слайдер с другим текстовым полем, изменились только значения первого текстового поля.Можно ли использовать JSlider, управляющий несколькими полями JText?

Ожидание ценных предложений Спасибо в Advance.

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

Что причина для управления 3 JTextFieds от JSlider, может быть, есть лучший способ, в противном случае вы посмотрите на 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

спасибо вам большое. –

Смежные вопросы