【问题标题】:Can't add ActionListener in Java无法在 Java 中添加 ActionListener
【发布时间】:2013-07-05 16:08:45
【问题描述】:

你能帮我处理这段代码吗?我怎样才能使它在单击按钮时出现第二个按钮?我已经添加了动作监听器并创建了第二个按钮,但我似乎无法做到。非常感谢大家!!!

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class Skeleton extends JFrame implements ActionListener {
    
    public static void main(String[] args) {

        JFrame frame = new JFrame("Skeleton");
        JPanel panel = new JPanel();
        JButton button = new JButton("This is a button.");
        JButton button2 = new JButton("Hello");

        frame.setSize(600,600);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        frame.setContentPane(panel);
        panel.setLayout(new FlowLayout());
        panel.add(button);        
    }

    public void actionPerformed(ActionEvent e) {

        panel.add(button2); //Whenever I compile with this line 
                            //of code inserted, it tells
                            //me cannot find Button 2 
    }    
}

再次感谢!

【问题讨论】:

  • 这个程序不会编译。
  • 此 GUI 存在多个问题。请调试并让我们知道您需要什么帮助。
  • 不要让类扩展 Jpanel。它没有任何意义。对于面板问题。将 main 中的所有代码移动到非静态方法。通过创建类的实例来调用这个非静态方法。然后将 Panel 实例和 button2 实例设为类级变量。
  • 我已经修复了 JButton 没有出现的问题。谢谢 pravat,我用 JFrame 扩展了主类,它工作了。 Tdorno 和 Vishal K,因为它现在可以编译并且工作正常,你能帮我处理 actionlistener 吗?非常感谢你们,也谢谢大家。
  • 还有一件事:Pravat,创建类的实例是什么意思?非常遗憾;我是一个完全的初学者新手。谢谢!

标签: java swing user-interface jpanel jbutton


【解决方案1】:

您的代码有很多问题。首先,您不能在 main() 方法中创建/构建您的 UI 您需要创建该类的一个实例并从那里调用该方法。

为了让您能够引用panelbutton2,您需要将它们设为类对象,而不是UI 方法中的本地对象。

您至少需要将ActionListener 添加到button

最后你只需要调用panel.revalidate()让面板显示添加的按钮:

    public class Skeleton extends JFrame implements ActionListener {

    public static void main(String[] args) {

        new Skeleton().buildUI();
    }

    JPanel panel;
    JButton button2;

    public void buildUI() {

        JFrame frame = new JFrame("Skeleton");
        panel = new JPanel();
        JButton button = new JButton("This is a button.");
        button2 = new JButton("Hello");

        frame.setSize(600, 600);
        frame.setResizable(false);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.setContentPane(panel);

        panel.setLayout(new FlowLayout());
        panel.add(button);

        button.addActionListener(this);

        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {

        panel.add(button2); 
        panel.revalidate();

    }
  }

【讨论】:

  • 非常感谢萨米!专家回答解释了一些东西:) 只有两个问题:所以重新验证与重新绘制相同吗?而且我没有得到一个类的实例,因为每次我在主方法之外创建一个组件,然后我在主方法中调用它,编译器就会开始给出一些静态和非静态的废话。那么添加“public void buildUI()? 和 new Skeleton().buildUI() 到底是在做什么?非常感谢!
  • no revalidate 与 repaint 不同,一种是用于验证组件内的所有组件,另一种是使用 paint()update() 方法重新渲染组件JComponent。类的实例意味着从一个类创建一个新对象,所以在这里你创建了一个new Skeleton()。您可能尝试的是在 main 中创建一个方法,这不一样。
  • @AhmedTawfik 如果这回答了您的问题,请将其标记为已接受的答案,谢谢!
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多