gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:21:54 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com