Java : 플로트 값은 JSLIDER 및 JTEXTFIELD를 연결합니다
-
20-09-2019 - |
문제
JSLIDER와 JTEXTFIELD를 연결하여 하나의 변경이 변경되면 다른 하나도 업데이트되지만 재귀 루프가 없도록 가장 잘하고 쉬운 방법은 무엇입니까?
감사해요!
해결책
다음은 빠르고 더러운 데모입니다.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Main {
public static void main(String[] args) {
final JFrame frame = new JFrame();
final JTextField text = new JTextField(20);
final JSlider slider = new JSlider(0, 100, 0);
slider.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
text.setText(String.valueOf(slider.getValue()));
}
});
text.addKeyListener(new KeyAdapter(){
@Override
public void keyReleased(KeyEvent ke) {
String typed = text.getText();
slider.setValue(0);
if(!typed.matches("\\d+") || typed.length() > 3) {
return;
}
int value = Integer.parseInt(typed);
slider.setValue(value);
}
});
frame.setLayout(new BorderLayout());
frame.add(text, BorderLayout.NORTH);
frame.add(slider, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
}
편집하다
플로트를 사용하려면 (제목에서 알 수 있듯이) JSLIDER 클래스를 다음과 같이 확장 할 수 있습니다.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
final DecimalFormat df = new DecimalFormat("0.####");
final JFrame frame = new JFrame();
final JTextField text = new JTextField(20);
final DoubleJSlider slider = new DoubleJSlider(0, 100, 0, 1000);
slider.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
text.setText(df.format(slider.getScaledValue()));
}
});
text.addKeyListener(new KeyAdapter(){
@Override
public void keyReleased(KeyEvent ke) {
String typed = text.getText();
slider.setValue(0);
if(!typed.matches("\\d+(\\.\\d*)?")) {
return;
}
double value = Double.parseDouble(typed)*slider.scale;
slider.setValue((int)value);
}
});
frame.setLayout(new BorderLayout());
frame.add(text, BorderLayout.NORTH);
frame.add(slider, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
}
class DoubleJSlider extends JSlider {
final int scale;
public DoubleJSlider(int min, int max, int value, int scale) {
super(min, max, value);
this.scale = scale;
}
public double getScaledValue() {
return ((double)super.getValue()) / this.scale;
}
}
위의 예는 100 단계에서 0과 0.1 사이의 간격을 나타냅니다.
이 (다시)는 빠르고 더러운 예일 뿐이지 만 당신의 길에 도움이 될 수 있습니다.
제휴하지 않습니다 StackOverflow