我已经创建了一个当前项目的示例,但是以SSCCE格式。
CODE已更新:
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Test2 extends JFrame{
private Panels panel1, panel2;
public Test2(){
init();
}
private void init(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new GridLayout(0,1));
panel1 = new Panels("Test1");
panel2 = new Panels("Test2");
add(panel1.getPanel());
add(panel2.getPanel());
pack();
setVisible(true);
}
public class Panels {
private JSlider slider;
private JPanel panel;
private JLabel label;
private ChangeListener changeListener;
private PropertyChangeSupport changeSup;
public Panels(String text){
slider = new JSlider();
slider.setMajorTickSpacing(50);
slider.setMaximum(255);
slider.setMinorTickSpacing(10);
slider.setPaintLabels(true);
slider.setPaintTicks(true);
setSliderValue(0);
label = new JLabel();
label.setText("0");
changeListener = new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
setLabelText(String.valueOf(getSliderValue()));
}
};
slider.addChangeListener(changeListener);
panel = new JPanel();
panel.add(label);
panel.add(slider);
}
public final int getSliderValue() {
return slider.getValue();
}
public final void setSliderValue(int value) {
slider.setValue(0);
}
public final String getLabelText() {
return label.getText();
}
public final void setLabelText(String text) {
String oldLabelText = getLabelText();
label.setText(text);
changeSup.firePropertyChange("value", oldLabelText, getLabelText());
}
public void
addPropertyChangeListener(PropertyChangeListener listener){
changeSup.addPropertyChangeListener("value", listener);
}
public void
removePropertyChangeListener(PropertyChangeListener listener){
changeSup.removePropertyChangeListener("value", listener);
}
public final JPanel getPanel(){
return panel;
}
}
public static void main(String[] args) {
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
Logger.getLogger(Test2.class.getName()).log(Level.SEVERE, null, ex);
}
EventQueue.invokeLater(new Runnable() {
public void run() {
new Test2();
}
});
}
}
再次注意这是一个SSCCE,非常准确。这个想法就在那里。
基本上,上面的代码会创建一个JFrame
,其中包含JSlider
个JLabel
,用Listener
更新JSliders
。我正在努力工作的是基于Bound Property
中的两个值更新另一个组件的某种方式。
我想我应该创建一个{{1}},但在Java领域我不熟悉。
如果这不是一个很好的方法,我愿意接受建议。
答案 0 :(得分:3)
您永远不会初始化或使用PropertyChangeSupport对象。你应该
this
。 addPropertyChangeListener(PropertyChangeListener listener)
和removePropertyChangeListener(PropertyChangeListener listener)
方法,以便其他班级可以添加听众并听取更改。setXXX(...)
方法触发支持对象,以通知侦听器更改,传入相应的属性名称以及旧值和新值。addPropertyChangeListener
和removePropertyChangeListener
方法。PropertyChangeListener tutorial
Google搜索中的第一个点击。)例如,请查看此处的代码: