java - 将多个面板和事件添加到 GUI

标签 java swing events mouseevent jtextfield

我是 java 新手,正在从事 GUI 作业,但遇到了一些问题。前提是一个简单的 GUI 窗口,其中有一些鼠标事件和一些键盘事件。

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

现在的问题来了。我创建了一个新面板 (panel2) 以将 JTextField 添加到窗口,现在我看到了 JTextField,但它占据了整个窗口,并且鼠标事件无法使用它。如果我将 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实现 ActionListener,这是 JTextField#addActionListener 所需的类型。请参阅How to Write an Action ListenersHow to Use Text Fields了解更多详情
  2. 您的 actionPerformed 方法实际上并未在 TheHandler 类中定义,而是 EventDemo 类的方法
  3. 当您认为要重写方法(或从接口(interface)实现方法)时,您应该使用@Override注释,因为这会导致编译器错误错了(出于某种原因)
  4. 您的字段未显示有两个原因,首先,textField 添加到 panel2 中,而 panel2 从未添加到任何内容,并且 textField2 是已添加到框架(在 BorderLayout.CENTER 的默认位置),但被 add(mousePanel, BorderLayout.CENTER); 覆盖/规避,所以它实际上是从未由框架 BorderLayout 进行布局。看看How to Use Borders了解更多详情

关于java - 将多个面板和事件添加到 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32687453/

相关文章:

java - 如何使用 VSCode 中的 Redhat 服务器连接器扩展在 JBoss 中启用热部署

java - 在Java中,如何动态判断数组的类型?

java - 将 JComponent 添加到 JPanel 并将 JPanel 添加到 JFrame 不起作用

c# - 使用 nunit 测试事件

c# - 如何将关键事件从控件冒泡到窗体?

Javascript - 在循环中获取按键

java - 编译成功但出现 NoClassDefFounderror

java - 甲骨文/JDBC : retrieving TIMESTAMP WITH TIME ZONE value in ISO 8601 format

java - GridBagLayout 中组件的大小不正确

Java Swing 问题