【问题标题】:Can't properly define handler method to close main program frame and dialog pop-up无法正确定义处理程序方法以关闭主程序框架和弹出对话框
【发布时间】:2020-05-24 03:56:51
【问题描述】:

说实话,我只是在学习 Java 上的 GUI,目前只学习 AWT,还没有 SWING。我似乎还不太了解如何使用侦听器或容器,并且在按下 X 按钮时我设法关闭了主程序框架窗口,但是对于我的弹出对话框错误消息,我无法实现同样的效果。这是我的代码:

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

@SuppressWarnings("serial")

public class AWTAccum extends Frame implements KeyListener {

    private Label lbl1;
    private Label lbl2;
    private TextField tf1;
    private TextField tf2;
    private int sum = 0;
    private Dialog pop;

    public AWTAccum() {

        setTitle("AWT Accumulator");
        setSize(300, 150);
        setLayout(new FlowLayout());
        setResizable(true);
        setVisible(true);

        lbl1 = new Label("Enter an integer");
        lbl2 = new Label("Accumulated sum is");
        tf1 = new TextField("", 10);
        tf2 = new TextField("0", 10);

        tf1.setEditable(true);
        tf2.setEditable(false);

        add(lbl1);
        add(tf1);
        add(lbl2);
        add(tf2);

        tf1.addKeyListener(this);

        pop = new Dialog(this, "Error", ModalityType.APPLICATION_MODAL);
        Label msg = new Label("You can enter integers only.");
        pop.setSize(200, 100);
        pop.setVisible(false);
        pop.setLayout(new FlowLayout());
        pop.add(msg);
        pop.setResizable(false);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent w) {
                if (w.getWindow().equals(this)) {
                    dispose();
                    System.exit(1);
                } else if (w.getWindow().equals(pop)) {
                    pop.dispose();
                }
            }
        });

    }

    public static void main(String[] args) {

        new AWTAccum();

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            try {

                sum = sum + Integer.parseInt(tf1.getText());
                tf1.setText("");
                tf2.setText(Integer.toString(sum));

            } catch (Exception ex) {

                pop.setVisible(true);

            }

        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }

}

非常感谢您的帮助。另外,如果有人愿意,请向我解释为什么 Dialog 需要一个所有者框架,它是否需要成为主类框架,或者如果我创建另一个框架类,那不会像另一个框架内的窗口吗?对话框让我很困惑,因为我认为我可以创建它的一个实例,但它向我显示错误,除非它是在框架类型类中创建的。我认为它本身就是一个顶级容器。

【问题讨论】:

标签: java user-interface awt


【解决方案1】:

我通常使用swing,所以我可能错了。但我认为您需要将弹出窗口设置为可聚焦,然后在弹出窗口中添加一个关键侦听器。

pop.setFocusable(true);
this.addKeyListener(pop);

另外你真的应该学习swing而不是awt,awt真的已经过时了。

【讨论】:

  • 嗨!我的代码终于奏效了,多亏了你给我的提示,这不正是 this.addKeyListener(pop);但是 pop.addWindowListener( ... 个性化的适配器代码,因为我没有实现整个接口)。并且不需要 pop.setFocusable(),我将向您展示作为我自己帖子的答案的代码。顺便说一句,我知道 AWT 可能很快就会被弃用,但我只想一步一步地走,这样我才能欣赏 SWING 中所做的改进。
【解决方案2】:
import java.awt.*;
import java.awt.Dialog.*;
import java.awt.event.*;

@SuppressWarnings("serial")

public class AWTAccum extends Frame implements KeyListener {

    private Label lbl1;
    private Label lbl2;
    private TextField tf1;
    private TextField tf2;
    private int sum = 0;
    private Dialog pop;

    public AWTAccum() {

        setTitle("AWT Accumulator");
        setSize(300, 150);
        setLayout(new FlowLayout());
        setResizable(true);
        setVisible(true);

        lbl1 = new Label("Enter an integer");
        lbl2 = new Label("Accumulated sum is");
        tf1 = new TextField("", 10);
        tf2 = new TextField("0", 10);

        tf1.setEditable(true);
        tf2.setEditable(false);

        add(lbl1);
        add(tf1);
        add(lbl2);
        add(tf2);

        tf1.addKeyListener(this);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent w) {
                dispose();
                System.exit(1);
            }
        });

        pop = new Dialog(this, "Error", ModalityType.APPLICATION_MODAL);
        Label msg = new Label("You can enter integers only.");
        pop.setSize(200, 100);
        pop.setVisible(false);
        pop.setLayout(new FlowLayout());
        pop.add(msg);
        pop.setResizable(false);
        //pop.setFocusable(true);

        pop.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent w) {
                pop.dispose();

            }
        });      

    }

    public static void main(String[] args) {

        new AWTAccum();

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            try {

                sum = sum + Integer.parseInt(tf1.getText());
                tf1.setText("");
                tf2.setText(Integer.toString(sum));

            } catch (Exception ex) {

                pop.setVisible(true);

            }

        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }

}

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多