如何在 Java Swing 中对单击执行多个操作
How to Perform Multiple Action on Single Click in Java Swing
我有一个关于通过单击 button
执行其他 buttons
操作的问题。三个按钮的一些示例代码:
JButton a = new JButton("a");
a.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of a is Here
}
});
JButton b = new JButton("b");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of b is Here
}
});
那些应该放在一起,比如:
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of c is Here
// Action of a
// Action of b
}
});
在上面的示例中,我有三个按钮 a,b,c
,每个按钮都有自己的操作;但如您所见,C 还必须 运行 A 和 B 的操作。解决此问题的好方法是什么?
无论您想在 Button 上做什么,单击 a,您都可以放入一个方法并从任何地方调用它。
public void methodForA(){
// do here what you want
}
您现在可以在您希望它从中调用的方法中调用它。在您的情况下,从按钮单击 A 和按钮单击 C
JButton a = new JButton("a");
a.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
methodForA();
}
});
// and also in your c-Button
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of c is Here
methodForA();
}
});
独立于 actionListeners 操作 Perform 方法为每个按钮创建 3 个方法,并从 actionPerfomed 方法调用它们:
private void btnAClicked(){};
private void btnBClicked(){};
private void btnCClicked(){};
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnCClicked();
btnAClicked();
btnBClicked();
}
});
1) 方法
为每个操作使用方法并在 ActionListener.actionPerformed
中调用它们
public void methodA(){}
public void methodB(){
methodA();
}
2) 动作实例
您可以创建自己的 类 个 ActionListener
来执行这些操作
第一次行动:
class ActionA implements ActionListener{
public void actionPerformed(ActionEvent e) {
...
}
}
一个改进的动作
class ActionB extends ActionA{
public void actionPerformed(ActionEvent e) {
super.actionPerformed(e); //Will call the first action
...
}
}
这是有限的,因为你不能有多个扩展,但也是一个很好的解决方案
3) 点击
最后但我不喜欢,使用AbstractButton.doClick
动态点击其他按钮。
4) 添加多个动作
请注意,这些方法不是 setActionListener
而是 addActionListener
,这意味着它将接受多个 ActionListener。
所以定义创建两个实例
ActionListener listenerA = new ActionLisener ..
ActionListener listenerB = new ActionLisener ..
buttonA.addActionListener(listenerA);
buttonB.addActionListener(listenerB);
buttonC.addActionListener(listenerA);
buttonC.addActionListener(listenerB);
通过一个小测试,我注意到动作是按照 B -> A 的顺序执行的(可能不具有普遍性)。
正如评论中所说,这应该是我们知道的风险,这将。如果一个动作因为异常而失败,是否应该执行下一个动作?默认情况下不会,因为进程不会隐藏异常。
我会将此解决方案限制为 GUI 管理,例如重置字段、禁用...可用于不同的按钮。
其他答案都是正确的,但这里缺少一个重要方面:小心 AWT event dispatcher thread.
上的 dong "too many things"
含义:单击按钮时,将创建一个 事件 ,并且 UI 框架使用该特殊线程来触发已注册的侦听器。如果其中一个侦听器现在决定进行密集计算……UI 事件线程会一直忙于执行 "that"。在做 "that thing" 的同时;此线程不可用于调度任何 other UI 事件。
因此,这是 "not only" 关于创建 methodA()、methodB()、methodC() 并在您的第三个动作侦听器中调用它们的内容。这也是关于理解 if 组合多个调用受制于 "I should better run those things in a separate thread; to not block the event dispatcher thread"。
从这个意义上说:其他答案告诉您从这里去哪里;但请务必小心您的 "joined actions" 按钮即将创建的 "amount of activity"!
我有一个关于通过单击 button
执行其他 buttons
操作的问题。三个按钮的一些示例代码:
JButton a = new JButton("a");
a.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of a is Here
}
});
JButton b = new JButton("b");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of b is Here
}
});
那些应该放在一起,比如:
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of c is Here
// Action of a
// Action of b
}
});
在上面的示例中,我有三个按钮 a,b,c
,每个按钮都有自己的操作;但如您所见,C 还必须 运行 A 和 B 的操作。解决此问题的好方法是什么?
无论您想在 Button 上做什么,单击 a,您都可以放入一个方法并从任何地方调用它。
public void methodForA(){
// do here what you want
}
您现在可以在您希望它从中调用的方法中调用它。在您的情况下,从按钮单击 A 和按钮单击 C
JButton a = new JButton("a");
a.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
methodForA();
}
});
// and also in your c-Button
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Action of c is Here
methodForA();
}
});
独立于 actionListeners 操作 Perform 方法为每个按钮创建 3 个方法,并从 actionPerfomed 方法调用它们:
private void btnAClicked(){};
private void btnBClicked(){};
private void btnCClicked(){};
JButton c = new JButton("c");
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnCClicked();
btnAClicked();
btnBClicked();
}
});
1) 方法
为每个操作使用方法并在 ActionListener.actionPerformed
public void methodA(){}
public void methodB(){
methodA();
}
2) 动作实例
您可以创建自己的 类 个 ActionListener
来执行这些操作
第一次行动:
class ActionA implements ActionListener{
public void actionPerformed(ActionEvent e) {
...
}
}
一个改进的动作
class ActionB extends ActionA{
public void actionPerformed(ActionEvent e) {
super.actionPerformed(e); //Will call the first action
...
}
}
这是有限的,因为你不能有多个扩展,但也是一个很好的解决方案
3) 点击
最后但我不喜欢,使用AbstractButton.doClick
动态点击其他按钮。
4) 添加多个动作
请注意,这些方法不是 setActionListener
而是 addActionListener
,这意味着它将接受多个 ActionListener。
所以定义创建两个实例
ActionListener listenerA = new ActionLisener ..
ActionListener listenerB = new ActionLisener ..
buttonA.addActionListener(listenerA);
buttonB.addActionListener(listenerB);
buttonC.addActionListener(listenerA);
buttonC.addActionListener(listenerB);
通过一个小测试,我注意到动作是按照 B -> A 的顺序执行的(可能不具有普遍性)。
正如评论中所说,这应该是我们知道的风险,这将。如果一个动作因为异常而失败,是否应该执行下一个动作?默认情况下不会,因为进程不会隐藏异常。
我会将此解决方案限制为 GUI 管理,例如重置字段、禁用...可用于不同的按钮。
其他答案都是正确的,但这里缺少一个重要方面:小心 AWT event dispatcher thread.
上的 dong "too many things"含义:单击按钮时,将创建一个 事件 ,并且 UI 框架使用该特殊线程来触发已注册的侦听器。如果其中一个侦听器现在决定进行密集计算……UI 事件线程会一直忙于执行 "that"。在做 "that thing" 的同时;此线程不可用于调度任何 other UI 事件。
因此,这是 "not only" 关于创建 methodA()、methodB()、methodC() 并在您的第三个动作侦听器中调用它们的内容。这也是关于理解 if 组合多个调用受制于 "I should better run those things in a separate thread; to not block the event dispatcher thread"。
从这个意义上说:其他答案告诉您从这里去哪里;但请务必小心您的 "joined actions" 按钮即将创建的 "amount of activity"!