在Java中调用类

时间:2012-03-31 02:57:56

标签: java

我想在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"); 
    } 
}); 

3 个答案:

答案 0 :(得分:2)

将两个boolean变量aClickedbClicked初始化为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种状态:

  1. 等待
  2. APressed
  3. BPressed
  4. BothPressed
  5. 等待有两个过渡:

    • 如果按下buttonA,则转换为Aressed
    • 如果按下buttonB,则转换为BPressed

    Aressed有一个转变:

    • 如果按下buttonB,则转换为BothPressed

    BPressed有一个转变:

    • 如果按下buttonA,则转换为BothPressed

    BothPressed有一个转换:

    • 立即过渡到等待

    在达到BothPressed时创建了一个C实例。

    如您所见,State Machines需要大量开销。除非你看到你的应用程序的逻辑变得更复杂,否则我会推荐使用布尔方法。

答案 2 :(得分:0)

将相同的事件处理程序附加到两个按钮。在该处理程序中增加一个计数器当计数器达到2时,创建一个C类实例。