Не удается правильно определить метод обработчика, чтобы закрыть основной фрейм программы и всплывающее диалоговое окно - PullRequest
1 голос
/ 08 февраля 2020

Если честно, я только учусь GUI на Java и в настоящее время изучаю только 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 нужен фрейм владельца, и должен ли он быть фреймом основного класса, или если я создаю другой класс фрейма, разве это не будет похоже на окно внутри другого? Диалог меня сильно смущает, так как я думал, что могу просто создать его экземпляр, но он показывает мне ошибки, если он не создан внутри класса типа фрейма. Я думал, что это был контейнер самого высокого уровня.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020
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
    }

}
0 голосов
/ 08 февраля 2020

Я обычно работаю со свингом, поэтому могу ошибаться. Но я думаю, вам нужно настроить всплывающее окно на фокусировку, а затем добавить в него ключевой слушатель.

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

Кроме того, вы должны действительно изучать свинг вместо awt, awt действительно устарел.

...