【问题标题】:Swing and events摇摆和事件
【发布时间】:2013-11-01 14:20:44
【问题描述】:

嗯,这是一个非常新的提示。我说要在窗口构建器的帮助下自己编写我的 GUI 应用程序的代码,我决定停止使用 netbeans,因为我在这里读过一些人说这很好。你可能认为我没有调查,但相信我,我做了我的功课......

我尝试了oracle所说的方式:

  1. 声明事件处理程序类并指定该类实现 ActionListener 接口或扩展实现 ActionListener 接口的类。例如:

    公共类 MyClass 实现 ActionListener {

  2. 将事件处理程序类的实例注册为一个或多个组件的侦听器。例如:

    someComponent.addActionListener(instanceOfMyClass);

  3. 在侦听器接口中包含实现方法的代码。例如:

    public void actionPerformed(ActionEvent e) { ...//对动作做出反应的代码... }

和我自己的方式(错了,当然,但我不知道出了什么问题)
package Todos;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Main extends JFrame {

private JPanel contentPane;
protected JButton btnNewButton;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Main frame = new Main();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });


}

/**
 * Create the frame.
 */
public Main() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().setLayout(new BorderLayout());
    //setDefaultLookAndFeelDecorated(false);
    //setIconImage(Image imagen);
    setTitle("");
    setSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize());
    setPreferredSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize());
    setLocationRelativeTo(null);

    this.btnNewButton = new JButton("New button");
    this.btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            asd(arg0);
        }
    });
    this.getContentPane().add(this.btnNewButton, BorderLayout.NORTH);
}

public void asd(ActionEvent arg0) {
    this.getContentPane().add(new JButton("asd"));
}
}

提示是,为什么这段代码不起作用,我试图通过 ActionPerformed 事件添加到 JFrame 的 JButton 在我单击后不可见。

这是一个示例代码,可能看起来很傻,但我认为它简化了提示,因为我的问题在于几行代码,不需要向您展示漏洞项目。

提前谢谢你!

【问题讨论】:

  • 你的问题是......?
  • 有什么问题?您没有按照您的描述创建或实现动作侦听器,而是使用内部类。
  • 抱歉,用我的问题进行了编辑...@nikpon,我使用了一个内部类来访问 JFrame 内容,就像 NetBeans 一样。这就是为什么我说“我自己的方式”(即使我按照 oracle 所说的方式做了,也对我不起作用)
  • 组件(按钮)不可见,因为容器(JFrame)不知道如何让它出现。

标签: java swing layout jbutton windowbuilder


【解决方案1】:

你的问题在这里:

public void asd(ActionEvent arg0) {
    this.getContentPane().add(new JButton("asd"));
}

表单Container.add()javadoc:

这个方法改变了布局相关的信息,因此, 使组件层次结构无效。 如果容器已经 显示后,必须验证层次结构,以便 显示添加的组件。

您需要调用validate() 方法使添加的按钮可见:

public void asd(ActionEvent arg0) {
    this.getContentPane().add(new JButton("asd"));
    this.getContentPane().validate();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多