Java-我的动作事件不';行不通
我正在学习Java和Swing,但我的JButton不起作用Java-我的动作事件不';行不通,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我正在学习Java和Swing,但我的JButton不起作用 import javax.swing.JFrame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Programma { public static void main(String[] args) { // TODO Auto-ge
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Programma {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e){
e.printStackTrace();
}
JFrame frame = new JFrame("DIG");
JPanel panel = new JPanel();
JButton button = new JButton("Click Me");
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button.setBounds(100, 100, 130, 35);
panel.add(button);
frame.add(panel);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JLabel label = new JLabel("Hello World");
label.setVisible(true);
panel.add(label);
}
});
}
}
frame.setVisible(true)代码>
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)代码>
顺便说一下,
按钮.setBounds(10010013035)
也不起作用。当您将组件动态添加到面板时,您需要重新填充它
这样做
panel.revalidate();
之后
panel.add(label);
当您将组件动态添加到面板时,需要重新填充它 这样做
panel.revalidate();
之后
panel.add(label);
我在您的代码中看到一些问题:
按钮.设置边界(10010013035)代码>该行将被忽略,您不应该手动确定组件的位置。请参阅,尽管您没有使用null布局,但这里解释了为什么不应该手动确定组件的位置
main
方法运行程序中的所有内容,这将很难在以后维护frame.setVisible(true)
,这将导致出现随机问题public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Your constructor here
}
});
}
JFrame
的大小,而不是调用并覆盖JPanel
的getPreferredSize()
方法在完成上述所有操作之后,您需要调用并打开
ActionListener
,以便您的程序绘制其新状态
该程序遵循上述所有建议,并产生以下输出(单击按钮3次之前和之后),我故意不使图像太大,使GUI变短(200 x 200而不是400 x 400)
我是在其他组件之前写的吗,比如JPanel,JButton。。。或者我应该在代码末尾写这个 frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 有什么区别 尽管我在建议中回答了这一点,但不同之处在于,如果在将所有元素添加到框架之前调用
setVisible
,那么您会发现自己遇到一些随机问题,在您将鼠标移到组件上(或组件应该在的位置)之前,组件并不都可见frame.pack()
和setVisible
应该是程序中最后调用的,并且frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)代码>可以在开头或结尾,它不会影响,但我更喜欢在结尾
按钮.立根(10010013035);不太管用
这是因为您使用了一个(这是实现GUI的正确方法)而不是一个null布局(您无论如何都不应该使用它)(参见第1点)
编辑
frame.setSize()和;和frame.setpack()
如果您阅读了pack()
:
使此窗口的大小适合其子组件的首选大小和布局。如果任意一个尺寸小于上一次调用setMinimumSize方法指定的最小尺寸,则生成的窗口宽度和高度将自动放大
因此,它将计算JFrame
的最小大小,其中所有元素都可见,并以它们的首选大小显示,而setSize
将只设置窗口大小,但如果在其中放置JScrollBar
,这将减小窗口大小,因此,这就是为什么您应该重写容器的getPreferredSize(…)
方法,这样它将计算其首选大小,包括JScrollBar
的宽度或一些可以修改其大小的其他元素。请参见(普遍的共识是是)我在您的代码中看到了一些问题:
按钮.设置边界(10010013035)代码>该行将被忽略,您不应该手动确定组件的位置。请参阅,尽管您没有使用null布局,但这里解释了为什么不应该手动确定组件的位置
您正在以main
方法运行程序中的所有内容,这将很难在以后维护
在将所有元素添加到frame.setVisible(true)
之前,您正在调用frame.setVisible(true)
,这将导致出现随机问题
您没有在上运行程序,您可以通过以下代码启动程序来解决此问题,该代码将程序放入EDT中。建议这样做,因为Swing不是线程安全的
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Your constructor here
}
});
}
您正在使用设置JFrame
的大小,而不是调用并覆盖JPanel
的getPreferredSize()
方法
在完成上述所有操作之后,您需要调用并打开ActionListener
,以便您的程序绘制其新状态
该程序遵循上述所有建议,并产生以下输出(单击按钮3次之前和之后),我故意不使图像太大,使GUI变短(200 x 200而不是400 x 400)
我是在其他组件之前写的吗,比如JPanel,JButton。。。或者我应该在代码末尾写这个
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
有什么区别
虽然我回答了这个问题