JButton 打印多次而不是一次。为什么?
JButton Prints Multiple Times Instead of Once. Why?
我有一个 JButton,代码如下。按下时,它会向控制台打印 3 次而不是一次。为什么要这样做以及如何解决这个问题?提前致谢!我也在 code ranch 上发帖了。
change61 = new JButton("N");
change61.setLocation(0,0);
change61.setSize(25,14);
change61.setFocusPainted(false);
change61.setBorder(new LineBorder(Color.BLACK));
change61.setMargin(new Insets(0,0,0,0));
change61.setFont(new Font("Arial", Font.BOLD, 7));
change61.setRolloverEnabled(false); // TEST
change61.addActionListener(this);
change61.setActionCommand("Normal");
buttons16.add(change61);
change61.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = change61.getModel();
if (model.isArmed()) {
cl1.setIcon(CL2);
lvrvr1.setIcon(LVRL);
dsw1.setIcon(LSIG);
dsy1.setIcon(CL1);
b1b.setIcon(LHC);
System.out.println("Button Pressed"); // THIS GETS PRINTED 3 TIMES TO CONSOLE INSTEAD OF ONCE
} else {
cl1.setIcon(CL1);
}
}
});
在 stateChagned 方法中,使用 isPressed 而不是 isArmed。应该可以。
或者按照@camickr 的建议
change61.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl1.setIcon(CL2);
lvrvr1.setIcon(LVRL);
dsw1.setIcon(LSIG);
dsy1.setIcon(CL1);
b1b.setIcon(LHC);
System.out.println("Button Pressed"); // THIS GETS PRINTED 3 TIMES TO CONSOLE INSTEAD OF ONCE
}
});
既然这个问题让我着迷,我想知道为什么它被解雇了三次。
正如堆栈跟踪显示的那样,更改是由鼠标事件触发的。
首先,按下鼠标。它调用 DefaultButtonModel.isArmed(true) 和 DefaultButtonModel.isPressed(true)。每个方法都会触发一个更改事件。这里我们有第一次和第二次迭代。
二是松开鼠标。它调用 DefaultButtonModel.isPressed(false),再次触发更改事件。第三次迭代。
仅供参考,DefaultButtonModel 是 ButtonModel 接口的实现。
我有一个 JButton,代码如下。按下时,它会向控制台打印 3 次而不是一次。为什么要这样做以及如何解决这个问题?提前致谢!我也在 code ranch 上发帖了。
change61 = new JButton("N");
change61.setLocation(0,0);
change61.setSize(25,14);
change61.setFocusPainted(false);
change61.setBorder(new LineBorder(Color.BLACK));
change61.setMargin(new Insets(0,0,0,0));
change61.setFont(new Font("Arial", Font.BOLD, 7));
change61.setRolloverEnabled(false); // TEST
change61.addActionListener(this);
change61.setActionCommand("Normal");
buttons16.add(change61);
change61.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = change61.getModel();
if (model.isArmed()) {
cl1.setIcon(CL2);
lvrvr1.setIcon(LVRL);
dsw1.setIcon(LSIG);
dsy1.setIcon(CL1);
b1b.setIcon(LHC);
System.out.println("Button Pressed"); // THIS GETS PRINTED 3 TIMES TO CONSOLE INSTEAD OF ONCE
} else {
cl1.setIcon(CL1);
}
}
});
在 stateChagned 方法中,使用 isPressed 而不是 isArmed。应该可以。
或者按照@camickr 的建议
change61.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl1.setIcon(CL2);
lvrvr1.setIcon(LVRL);
dsw1.setIcon(LSIG);
dsy1.setIcon(CL1);
b1b.setIcon(LHC);
System.out.println("Button Pressed"); // THIS GETS PRINTED 3 TIMES TO CONSOLE INSTEAD OF ONCE
}
});
既然这个问题让我着迷,我想知道为什么它被解雇了三次。
正如堆栈跟踪显示的那样,更改是由鼠标事件触发的。
首先,按下鼠标。它调用 DefaultButtonModel.isArmed(true) 和 DefaultButtonModel.isPressed(true)。每个方法都会触发一个更改事件。这里我们有第一次和第二次迭代。 二是松开鼠标。它调用 DefaultButtonModel.isPressed(false),再次触发更改事件。第三次迭代。
仅供参考,DefaultButtonModel 是 ButtonModel 接口的实现。