2013-06-06 1 views
0

세 개의 JTextField에서 텍스트를 설정하기 위해 JSlider를 사용하려고했습니다. 다른 두 텍스트 필드와 마찬가지로, textfield_1에 포커스가있을 때만 슬라이더가 textfield_1에서 작동해야합니다. 다른 슬라이더와 동일한 슬라이더를 사용하려고하면 첫 번째 텍스트 필드 값만 변경됩니다.여러 JTextfield를 제어하는 ​​JSlider를 사용할 수 있습니까?

귀중한 의견을 기다리고 있습니다. 미리 감사드립니다.

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

정말 고마워요. –

관련 문제