向 GUI 添加多个面板和事件

Adding multiple Panels and events to a GUI

我是 java 的新手,正在处理 GUI 作业,我 运行 遇到了一些问题。前提是一个简单的 GUI window,其中包含一些鼠标事件和一些键盘事件。

我将 window 与一些鼠标事件放在一起,一旦它开始工作,就开始向 window 添加几个 JTextFields,但它们没有出现在 window 上我不确定为什么。

现在问题来了。我创建了一个新面板 (panel2) 以将 JTextFields 添加到 window,现在我看到了 JTextFields,但它覆盖了整个 window 并且鼠标事件不适用于它。如果我将 JTF 添加到鼠标事件上方的面板,则 JTF 不会显示并且鼠标事件有效......

代码

import javax.swing.*;

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

    public class EventDemo extends JFrame {

        private JPanel mousePanel;
        private JPanel panel1;
        private JPanel panel2;
        private JPanel panel3;
        private JLabel statusBar;
        private JLabel directions1;
        private JLabel directions2;
        private JLabel directions3;
        private JTextField textField1;
        private JTextField textField2;

    public EventDemo() {
        super("EVENT DEMO PROGRAM");

    panel1 = new JPanel();
    panel2 = new JPanel();

    //Add directions for the events to top of the window.
    directions1 = new JLabel("Enter & Leave window." + 
                            "    Press & hold, release, drag, move cursor to display a message in statusbar." + 
                            "    Clicking in one spot will display coordinates.");  
    panel1.add(directions1);
    add(panel1, BorderLayout.PAGE_START);   

    //Add mouse and statusBar to panel.
    mousePanel = new JPanel();
    mousePanel.setBackground(Color.WHITE); 
    add(mousePanel, BorderLayout.CENTER);   
    statusBar = new JLabel("Default");
    add(statusBar, BorderLayout.SOUTH);

    //Create handler object for Mouse events
    TheHandler handler = new TheHandler();
    mousePanel.addMouseListener(handler);
    mousePanel.addMouseMotionListener(handler); 


    textField1 = new JTextField(10);
    panel2.add(textField1, BorderLayout.SOUTH);
    textField2 = new JTextField("Enter Text Here");
    panel2.add(textField2, BorderLayout.SOUTH);
    add(panel2);

    TheHandler handlerJTF = new TheHandler();
    textField1.addActionListener(handlerJTF);
    textField2.addActionListener(handlerJTF); 


    }

    private class TheHandler implements MouseListener, MouseMotionListener {
        public void mouseClicked(MouseEvent event) {
            statusBar.setText(String.format("YOU CLICKED THE MOUSE AT %d, %d", event.getX(), event.getY()));
        }

        public void mousePressed(MouseEvent event) {
            statusBar.setText("YOU HAVE PRESSED THE MOUSE BUTTON.");
        }

        public void mouseReleased(MouseEvent event) {
            statusBar.setText("YOU HAVE RELEASED THE MOUSE BUTTON.");
        }

        public void mouseEntered(MouseEvent event) {
            statusBar.setText("YOU HAVE ENTERED THE WINDOW THE BACKGROUND CHANGES TO RED.");
            mousePanel.setBackground(Color.RED);
        }

        public void mouseExited(MouseEvent event) {
            statusBar.setText("EXITING THE WINDOW, BACKGROUND CHANGES BACK TO WHITE.");
            mousePanel.setBackground(Color.WHITE);
        }

        //Mouse Motion events.
        public void mouseDragged(MouseEvent event) {
            statusBar.setText("YOU ARE DRAGGING THE MOUSE.");
        }
        public void mouseMoved(MouseEvent event) {
            statusBar.setText("YOU ARE MOVING THE MOUSE AROUND.");
        }
    }

    public void actionPerformed(ActionEvent event) {
        textField1.getText();
        textField2.getText();
    }
    public static void main(String[] args) {
        EventDemo go = new EventDemo();
        go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        go.setSize(960, 300);
        go.setVisible(true);
        new EventDemo();

    }
    }
  1. TheHandler 不是 implement ActionListener,后者是 JTextField#addActionListener 的必需类型。有关详细信息,请参阅 How to Write an Action Listeners and How to Use Text Fields
  2. 您的 actionPerformed 方法实际上并未在 TheHandler class 中定义,而是 EventDemo class
  3. 的方法
  4. 当您认为自己正在覆盖方法(或从 interface 实现方法)时,您应该使用 @Override 注释,因为这会在您出错时导致编译器错误(对于某些原因)
  5. 您的字段没有出现有两个原因,首先,textField 被添加到 panel2 中,后者从未添加到任何内容中,textField2 被添加到框架中(位于BorderLayout.CENTER) 的默认位置,但 add(mousePanel, BorderLayout.CENTER); 已经 overriden/circumvented,所以它实际上从未被 BorderLayout 框架布局。查看 How to Use Borders 了解更多详情