【问题标题】:Waiting till button is pressed等到按钮被按下
【发布时间】:2014-09-05 16:44:12
【问题描述】:

对此有很多问题,但他们无法帮助我或者我不明白..

基本上我希望用户在系统返回主方法之前按下按钮。在这种情况下,如果系统返回主方法,系统将退出。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class test123 implements ActionListener{


JTable table;
JButton button;
JFrame frame; 

public test123 (){

    frame = new JFrame();
    frame.setLayout(null);

    button = new JButton("Finish");
    button.setBounds(200, 10, 70, 40);
    button.addActionListener(this);

    frame.add(button);


    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
    frame.setSize(600, 200);
    frame.setVisible(true);
    frame.setTitle("TEst123");  
}


public void actionPerformed(ActionEvent e){
    if(e.getSource() == button){
        System.out.println("message....");
    }
}

public static void main(String arg[]){
    test123 gui = new test123();

    System.exit(0);

}
}

对不起,如果只是我缺乏理解,谢谢你的帮助。

编辑: 也许我解释不正确或显示不正确。可以说如果系统返回主系统,它会做一些我不想要的事情,因此我希望用户按下按钮返回主系统或做“事情”。抱歉解释不好,包括这个。

这个类与我的工作是分开的,我只是用它来测试东西......在我的项目中,用户可以从几个按钮中进行选择(假设在这种情况下主方法是菜单)。用户按下一个按钮进入一个新的窗口/框架,如果程序没有暂停或等待按钮被按下,它将返回到 main 方法。

【问题讨论】:

  • 那么,您希望程序在按下按钮时关闭?
  • “但他们无法帮助我,或者我不理解它..” 那么有什么可以相信我们可以用某种方式来解释它能理解吗?也许开始 - 问题是什么,这些答案对你没有帮助 - 或者你对这些答案有什么不理解?
  • System.exit(0); 移动到actionPerformed(ActionEvent) 方法中。顺便说一句 - 您使用什么资源来学习 Swing?它似乎给你带来了很多坏习惯(AKA - '那个代码是垃圾')。
  • @Aeshang 这几乎是我今天读过的最愚蠢的评论。首先,ActionListener 是按钮的正确监听器(通常)。其次,OP希望通过按键而不是单击按钮来移动它。第三,它没有解决实际问题。
  • 您对“回到主目录” 方法的重复声明绝对没有意义。 main 方法通常不应该被调用。这是 jvm 的简单启动点。 Swing 是事件驱动的,这意味着一切都通过事件发生。 没有没有“等待”。当用户激活一个组件时,监听这些事件的代码会做一些事情。如果你想要一个主屏幕,那么只需让主菜单按钮监听器显示主屏幕。

标签: java swing button actionlistener


【解决方案1】:

快速回答是 Andrew Thompson 在他的评论中写道:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;

public class test123 implements ActionListener {

    JTable table;
    JButton button;
    JFrame frame;

    public test123() {

        frame = new JFrame();
        frame.setLayout(null);

        button = new JButton("Finish");
        button.setBounds(200, 10, 70, 40);
        button.addActionListener(this);

        frame.add(button);

        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setSize(600, 200);
        frame.setVisible(true);
        frame.setTitle("TEst123");
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button) {
            System.out.println("message....");
//          System.exit(0);
            frame.dispose(); // better than exit
        }
    }

    public static void main(String arg[]) {
        test123 gui = new test123();
    }

}

但 Java 类名应该以大写 test123 -> Test123 开头(但您肯定可以找到更好的名称)。

为什么不扩展 JFrame 呢?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Test123 extends JFrame implements ActionListener {

    private static final long serialVersionUID = 3378774311250822914L;

//  private JTable table;
    private JButton button;
//  JFrame frame;

    public Test123() {

//      frame = new JFrame();
        this.setLayout(null);

        button = new JButton("Finish");
        button.setBounds(200, 10, 70, 40);
        button.addActionListener(this);

        this.add(button);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(600, 200);
        this.setTitle("Test123");
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button) {
            System.out.println("message....");
//          System.exit(0);
            this.dispose();
        }
    }

    public static void main(String arg[]) {
        Test123 gui = new Test123();
    }

}

Concurrency in Swing tutorial 中阅读更多内容,了解如何处理调度线程外的长时间运行任务...


从您的问题看来,您不知道摇摆应用程序的行为方式。您创建了一个 GUI,并且您正在等待用户的输入。所以基本上你不关心你的程序在执行什么,当用户按下按钮时...... (因此返回到哪里并不重要)

【讨论】:

  • 关于将System.exit(0) 更改为dispose() 以及许多其他提示的好电话。代码中仍有一些值得关注的地方,但它们超出了问题的范围。
  • @AndrewThompson 随时分享,在更大的框架中我会使用布局(但在这个简单的示例中不需要)并且设置大小也不是我喜欢的东西(但这与布局有关还)。当然在更大的例子中使用面板更好,字符串应该在生产代码中本地化,但是对于这个例子来说太多了......
  • 我同意。我认为您已经涵盖的内容超出了 OP 的要求,额外的提示只是“蛋糕上的奶油”。我所指的“其他问题”几乎是可怕地缺乏使用布局管理器,但如果 OP 询问(关于专门问题),我只会讨论这个问题。仅仅回答这个问题就太费劲了。
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 2013-07-25
  • 2011-08-03
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多