创建自定义绑定属性

时间:2014-04-10 00:39:33

标签: java swing javabeans propertychangelistener

解释

我已经创建了一个当前项目的示例,但是以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,其中包含JSliderJLabel,用Listener更新JSliders。我正在努力工作的是基于Bound Property中的两个值更新另一个组件的某种方式。


我该怎么做

我想我应该创建一个{{1}},但在Java领域我不熟悉。

如果这不是一个很好的方法,我愿意接受建议。

1 个答案:

答案 0 :(得分:3)

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

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

例如,请查看此处的代码:

相关问题