2

解释

我已经创建了我当前项目的一个示例,但采用的是 SSCCE 形式。

代码已更新:

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用 2JSlider更新 aJLabel和 a 的代码Listener。我要尝试的是基于JSliders.


我该怎么办

我想我应该创建一个Bound Property,但我不熟悉 Java 的那个领域。

如果这不是解决问题的好方法,我愿意接受建议。

4

1 回答 1

3

您永远不会初始化或使用您的 PropertyChangeSupport 对象。你应该

  • 将您的 PropertyChangeSupport 变量更改为 SwingPropertyChangeSupport 变量,因为这是您正在使用的 Swing,因此您希望在 EDT(即 Swing 事件线程)上完成所有通知。
  • 初始化 PropertyChangeSupport 对象并传入其构造函数this,即当前对象。
  • 给你的类一个addPropertyChangeListener(PropertyChangeListener listener)和一个removePropertyChangeListener(PropertyChangeListener listener)方法,以便其他类可以添加监听器并监听变化。
  • 在上述方法中,将侦听器添加或删除到您的支持对象。
  • 您应该以一种或多种方法触发支持对象,setXXX(...)以将更改通知侦听器,并传入适当的属性名称以及旧值和新值。
  • 请注意,如果您的类扩展了 Swing 组件,则它已经具有 PropertyChange 支持。检查 API,包括addPropertyChangeListenerremovePropertyChangeListener方法。
  • 话虽如此,您几乎永远不会想要扩展 JFrame。
  • 您应该阅读这方面的教程,因为只需稍加搜索即可找到它们(上面的链接是PropertyChangeListener tutorial谷歌搜索的第一次点击)。

例如,请看这里的代码:

于 2014-04-10T01:32:33.307 回答