按钮功能不起作用?

时间:2014-07-27 09:17:23

标签: java swing button static

因此,我尝试使用swing组件编写程序,因此每当用户单击按钮时,文本框中会显示不同的单词。我一直收到错误说#34;非静态方法按钮()无法从静态上下文中引用"我检查了有关如何使用相同错误修复它的其他答案,但我仍然不理解它。它出现在这里:

  

color.buttons();

这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class color {
    private JFrame f;
    private JLabel label;
    private JPanel controlPanel;
    private JButton button1;
    private JButton button2;
    private JButton button3;
    private JTextField textbox;

    public color() {
        prepareGUI();
    }

    public static void main(String args[]) {
        color c = new color();
        color.buttons();
    }
    private void prepareGUI() {
        f = new JFrame("Colors");
        f.setSize(400, 400);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });
        label = new JLabel("", JLabel.CENTER);
        label.setBounds(20, 105, 200, 25);

        textbox = new JTextField("", JTextField.CENTER);
        textbox.setBounds(20, 75, 125, 50);

        f.add(label);
        f.add(textbox);
        f.setVisible(true);
    }
    private void buttons() {
        label.setText("Click a Button to Reveal Text");
        textbox.setText("Which Color?");

        JButton button1 = new JButton("Blue");
        button1.setBounds(10, 305, 120, 75);
        JButton button2 = new JButton("Red");
        button2.setBounds(140, 305, 120, 75);
        JButton button3 = new JButton("Yellow");
        button3.setBounds(270, 305, 120, 75);

        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                textbox.setText("Blue");
            }
        });
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                textbox.setText("Red");
            }
        });
        button3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                textbox.setText("Yellow");
            }
        });

        controlPanel.add(button1);
        controlPanel.add(button2);
        controlPanel.add(button3);

        f.setVisible(true);
    }
}

3 个答案:

答案 0 :(得分:2)

您应该尝试c.buttons();而不是color.buttons();

由于无法直接引用非静态方法,因此需要一个对象来执行此操作。

如果该方法是静态的,那么您可以使用color.buttons();

答案 1 :(得分:2)

当字段为associated with a class, rather than with any particular object时,会使用static声明。现在,让我们考虑一下你的代码:

public static void main(String args[]) {
    color c = new color();
    color.buttons();
}

当然,主要方法static,以便最初运行您的代码。通过扩展,static main方法中的所有内容也必须为static,或者换言之,必须能够在不与任何对象直接关联的情况下运行。因此,您无法调用color.buttons(),因为该方法不是static方法。

您有两种解决方案:

  1. 制作方法static。当然,在这种情况下使它static实际上可能没有意义,但有时在其他情况下可能是合适的。
  2. 在新的实例化颜色对象c中调用方法,如下所示:c.buttons();或在构造函数buttons()内调用color()
  3. 为清楚起见,代码中的第二个解决方案如下所示:

    public color() {
        prepareGUI();
        buttons();
    }
    

    OR

    public static void main(String args[]) {
        color c = new color();
        c.buttons();
    }
    

    可以在c.buttons() main方法中调用static,因为buttons()方法是与实例化对象c相关联的方法。

    最后,一些最佳做法和提示:

    1. 您应该阅读Java Naming Conventions并将其应用于您的代码。例如,您的班级应该大写为Color而不是color。以下命名约定使其他人更容易阅读您的代码,因为命名约定是开发人员同意的一种契约。
    2. 您不应该在Event Dispatch Thread (EDT)之外调用Java Swing方法,因为大多数Swing方法都不是线程安全的。在EDT之外调用Swing方法可能会导致以后难以发现的问题。

答案 2 :(得分:1)

您无法从java中的静态方法调用非静态方法。 在您的情况下,您尝试调用方法按钮()这是一个非静态方法,其中main方法(您调用按钮方法)是一个静态方法。 像这样改变你的主要方法。

public static void main (String args[]){
color c = new color();
c.buttons();
}

通过这种方式,您可以调用对象的成员函数。