Java-我的动作事件不';行不通

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

我正在学习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-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);

            }
        });

    }
}
  • 框架和按钮是可见的,当我单击它时,标签不会出现。我怎样才能解决这个问题

  • 我是在JPanel、JButton等其他组件之前编写,还是在代码末尾编写:

    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)之前,您正在调用
    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)

    有什么区别

    尽管我在建议中回答了这一点,但不同之处在于,如果在将所有元素添加到框架之前调用
    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)

    有什么区别

    虽然我回答了这个问题