【问题标题】:Not waiting for a method call to finish before calling another method在调用另一个方法之前不等待方法调用完成
【发布时间】:2012-08-13 22:18:41
【问题描述】:

我需要一点帮助。 我刚刚失业后回到编程领域。

我正在尝试学习 Java,但遇到了困难。

问题是我想调用一个方法,该方法应该通过按下按钮来询问用户输入。这会将选择返回给调用该方法的类。

    public class ButtonMain {
        private static CreateButton cButton;

        public static void main(String[] args) {
            cButton = new CreateButton();
            cButton.launchButton();
            switch(cButton.getSelect()) {
                case 'a' : System.out.println("German Car");
                    break;
                case 'b' : System.out.println("Japanese Car");
                    break;
                default : System.out.println("Incorrect Car Selected");               
                    break;
            }
        }
    }

其余代码如下

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CreateButton implements ActionListener {
    private JFrame mainFrame;
    private JLabel label1;
    private JButton button1;
    private JButton button2;
    private char select = ' ';

    public CreateButton() {
    }

    public void launchButton() {
        createFrame();
        createLabel();
        createButton1();
        createButton2();
    }

    private void createFrame() {
        mainFrame = new JFrame("Cars");
        mainFrame.setSize(200, 200);
        mainFrame.setLocation(300, 300);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setVisible(true);
        mainFrame.setPreferredSize(null);
        mainFrame.setLayout(new java.awt.GridLayout(3, 1));
    }

    private void createLabel() {
        label1 = new JLabel("Cars", SwingConstants.CENTER);
        label1.setSize(200, 100);
        mainFrame.getContentPane().add(label1, BorderLayout.CENTER);
    }

    public void createButton1() {
        button1 = new JButton("Mercedes");
        button1.setSize(200, 50);
        button1.addActionListener(this);
        mainFrame.getContentPane().add(button1, BorderLayout.CENTER);
    }

    private void createButton2() {
        button2 = new JButton("Lexus");
        button2.setSize(200, 50);
        button2.addActionListener(this);
        mainFrame.getContentPane().add(button2, BorderLayout.CENTER);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button1) {
            select = 'a';
            System.out.println(select);
        }
        else if (e.getSource() == button2) {
            select = 'b';
            System.out.println(select);
        }
    }

    public char getSelect() {
        return select;
    }
}    

发生的情况是输出应该是 a 或 b,然后是选择了德国车还是日本车,但我选择了不正确的车。

【问题讨论】:

  • 尝试并记住,Swing 是一个事件驱动的环境。那是发生了一些事情,你会回应它。这是一个可以有点习惯的概念;)

标签: java swing frame


【解决方案1】:

代码运行良好。它是您的代码正在运行,没有任何东西可以阻止它。 cButton.launchButton() 只显示框架和运行后的代码。由于select 已初始化为空格字符,因此程序启动时会打印“Incorrect Car Selected”。您对按钮的操作正常。您的 switch 语句应该在 actionPerformed 方法中。

    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == button1) {
        select = 'a';
        System.out.println(select);
    } else if (e.getSource() == button2) {
        select = 'b';
        System.out.println(select);
    }

    switch (getSelect()) {
    case 'a':
        System.out.println("German Car");
        break;
    case 'b':
        System.out.println("Japanese Car");
        break;
    default:
        System.out.println("Incorrect Car Selected");
    }

}

【讨论】:

  • 尝试在 swtich 语句的 main 上放置一个断点。调试代码并等待框架显示。然后在断点之后继续,我想你会看到发生了什么。
【解决方案2】:

问题是在调用 main 的那一刻你将没有选择信息。最好在 ActionListener 本身中处理这个问题。

或

一旦实现了一个 Swing 组件,所有可能影响或依赖于该组件状态的代码都应该在事件调度线程中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多