问题描述
Javs Swing Error 您可以在上图中看到代码和输出。我已经将Eclipse IDE用于Java swing。但是按钮没有按预期来。我对Java Swing和Eclipse都是新手,所以我不知道是否需要任何其他设置。请帮我,谢谢。
解决方法
您在问题中写道
我是新来的... Java Swing
然后,我建议您阅读教程Creating a GUI With JFC/Swing
请勿调用方法setBounds()
来放置组件–除非您未使用布局管理器 1 ,但是根据您的代码,您正在使用布局管理器,因为您的代码确实不致电frame.setLayout(null)
。
{{1}的[内容窗格]的默认布局管理器是BorderLayout。由于您的代码未使用add(Component,Object)方法将JFrame
和JButton
添加到JTextField
,因此这两个组件都添加到了CENTER面板中,因此在顶部绘制了一个其他的。此外,CENTER面板使其组件尽可能大。因此JFrame
占据了所有JButton
。
这里是对代码的重写,但是如果您是认真学习 Swing 的人,我真的建议您花些时间并努力阅读整个教程。还要注意,在下面的代码中,我更改了不遵守Java naming conventions的那些名称。我们使用命名约定,以使我们更容易阅读他人的代码,并使其他人阅读我们的代码。
以下代码中需要注意的其他事项。
-
JFrame
实现使用lambda expression - 所有 Swing 代码必须在事件调度线程(EDT)上执行。创建并显示
ActionListener
时,它也会启动EDT,但是您也可以编写代码来显式启动EDT,这就是我在下面代码的JFrame
方法中所做的事情。 - 您可以调用
main()
方法之一,将setLocation...()
放在屏幕的特定位置。如果不这样做,则将其放置在屏幕的左上角。以下代码调用JFrame
,以使主机操作系统决定将setLocationByPlatform()
定位在屏幕上的位置。
JFrame
是的,在上面的代码中我没有调用import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class JavaSwingPractice implements Runnable {
@Override // java.lang.Runnable
public void run() {
createAndShowGui();
}
private void createAndShowGui() {
JFrame frame = new JFrame("Dialog Box!");
JTextField textF = new JTextField(14);
JButton button = new JButton("Click!");
button.addActionListener(e -> textF.setText("Success!"));
JPanel panel = new JPanel();
panel.add(button);
frame.add(textF,BorderLayout.PAGE_START);
frame.add(panel,BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new JavaSwingPractice());
}
}
,因为至少在JDK 8中,默认值似乎是setDefaultCloseOperation()
。
1 –有关布局管理器的说明和详细信息,请参见Swing教程。
,问题可能是面板的布局管理器(如果不使用面板,则应使用面板直接添加对象而不是框架),如果使用布局管理器,则会出现以下情况在面板中放置对象的一些规则。我想让布局管理器保持为null,尽管有些人不喜欢说布局管理器为null,但是如果您要使用绝对位置,则setLayout(null);可以工作