gpt4 book ai didi

java - 创建自定义绑定(bind)属性

转载 作者:行者123 更新时间:2023-11-30 08:24:23 24 4
gpt4 key购买 nike

说明

我已经为我当前的项目创建了一个示例,但采用的是 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,非常准系统。虽然想法是存在的。

基本上,上面的代码创建了一个带有 2 个 JSliderJFrame,它用 Listener 更新了一个 JLabel。我试图开始工作的是根据 JSliders 中的两个值更新另一个组件的某种方式。


我该怎么办

我想我应该创建一个绑定(bind)属性,但我不熟悉 Java 的那个领域。

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

最佳答案

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

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

例如,请看这里的代码:

关于java - 创建自定义绑定(bind)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com