我想在Java中编写三个类,当在A类中单击一个按钮而在B类中单击另一个按钮时,这两个事件组合在一起创建了一个C类实例。我该怎么做?
(评论更新:)
以下是事件代码。
// There is a text area showing when it is clicked and when it
// gets a response back from the thirdclass
...
buttonpanel = new JPanel();
getItButton = new JButton("Call ThirdClass");
getItButton.addActionListener (new ActionListener() {
public void actionPerformed (ActionEvent evt) {
textarea.append("Calling thirdclass...\n");
String result = thirdclass.fetch_message();
textarea.append(" Result = " + result + "\n\n");
}
});
答案 0 :(得分:2)
将两个boolean
变量aClicked
和bClicked
初始化为false
。
当用户点击A类中的按钮时,请将aClicked
设置为true
。然后执行以下逻辑:
if (aClicked && bClicked)
{
new ClassC();
}
aClicked = false;
bClicked = false;
当用户点击B类中的按钮时,请将bClicked
设置为true
。然后执行相同的逻辑。
我需要更多细节才能找到更好的答案。
编辑:鉴于您的代码示例和使用匿名类,我写了以下内容。我通常不用Java编写GUI,而当我这样做时,它是用WindowBuilder编写的。这点可能不是线程安全的,可能无法正确清理资源,但关键是要使用boolean
关键字来证明在匿名类中引用final
变量的概念。 / p>
这对我有用。如果它对您没有帮助,我将需要更多代码。
另外,对于State
类,如果你的逻辑变得更复杂,我会推荐Jake Greene推荐的FSM方法。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class Main {
public static void main(String[] args) {
final State state = new State();
final JTextArea textArea = new JTextArea(1, 10);
textArea.setEditable(false);
JButton buttonA = new JButton("Button A");
buttonA.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
state.clickA();
if (state.bothClicked()) {
textArea.setText("both clicked.");
}
}
});
JButton buttonB = new JButton("Button B");
buttonB.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
state.clickB();
if (state.bothClicked()) {
textArea.setText("both clicked.");
}
}
});
JButton reset = new JButton("Reset!");
reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
state.reset();
textArea.setText("");
}
});
JPanel pane = new JPanel();
pane.add(buttonA);
pane.add(buttonB);
pane.add(textArea);
pane.add(reset);
JFrame frame = new JFrame();
frame.setContentPane(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
class State {
private boolean aClicked;
private boolean bClicked;
public void clickA() {
this.aClicked = true;
}
public void reset() {
this.aClicked = false;
this.bClicked = false;
}
public void clickB() {
this.bClicked = true;
}
public boolean bothClicked() {
return this.aClicked && this.bClicked;
}
}
答案 1 :(得分:1)
根据应用程序的不同,您可能希望了解如何创建Finite State Machine。您可以使用枚举在Java中构建一个简单的状态机,如here
所述给定示例的状态机可能有4种状态:
等待有两个过渡:
Aressed有一个转变:
BPressed有一个转变:
BothPressed有一个转换:
在达到BothPressed时创建了一个C实例。
如您所见,State Machines需要大量开销。除非你看到你的应用程序的逻辑变得更复杂,否则我会推荐使用布尔方法。
答案 2 :(得分:0)
将相同的事件处理程序附加到两个按钮。在该处理程序中增加一个计数器当计数器达到2时,创建一个C类实例。