无法正确定义处理程序方法以关闭主程序框架和对话框弹出窗口

问题描述 投票:1回答:2

老实说,我只是学习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
    }

}

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

java user-interface awt
2个回答
0
投票

我通常使用秋千,所以我可能是错的。但是我认为您需要将弹出窗口设置为可聚焦的,然后向该弹出窗口添加一个关键侦听器。

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

另外,您应该真正学习秋千而不是awt,awt确实已经过时。


0
投票
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
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.