Java / Swing JButton不显示其文本,也不执行其操作

时间:2019-06-04 19:06:51

标签: java eclipse swing user-interface jbutton

我想编写一个简单的路口交通信号灯系统。我要创建一个将启动整个程序的按钮(打开交通灯系统的GUI)。但是我的第一个按钮已经开始出现问题。它不会显示其文本,并且应该执行的操作不会发生。我真的是一个初学者,所以可能有点愚蠢和明显的错误,但是请看看我会很高兴^^

package kreuzung;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;

public class HomeFrame extends JFrame{

    public HomeFrame(String title) {
        super(title);

    this.setLayout(new FlowLayout(FlowLayout.CENTER));

    Button test = new Button("noAction");


    Container cont = getContentPane();

    cont.add(test, BorderLayout.CENTER);



    }
}

这将是生成的按钮,它不会执行应有的操作

package kreuzung;

import javax.swing.Action;
import javax.swing.JButton;

public class Button extends JButton{

    private String actionName;

    public Button(String actionName) {

        this.actionName = actionName;                       //set the Action name of this button                             

        JButton button = new JButton();                     //instantiate this Button
        button.setText(actionName);                         //set the Action Name as Button Text
        button.setSize(30, 30);             
        button.setBounds(5, 5, 25, 25);     




        button.addActionListener(new Evt(this.actionName));     //add an Action Listener to the button 
                                                            //and gets the Action from the Evt Class
    }

}

最后但同样重要的是Evt类,应注意执行的动作

package kreuzung;
import java.awt.event.*;

import javax.swing.JFrame;

public class Evt implements ActionListener {

    private String actionName;

    public Evt(String actName) {

        this.actionName = actName;

    }



    @Override
    public void actionPerformed(ActionEvent e) {
        switch(actionName) {
        case "noAction":
            JFrame frame = new HomeFrame("Home");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 400);
            frame.setVisible(true);
            break;
        }
    }

}

3 个答案:

答案 0 :(得分:2)

您的代码中有几个错误:

  1. 您不应该扩展JFrame,请参阅Extends JFrame vs. creating it inside the program
  2. 不要调用setBounds(...)Layout Managers将负责放置组件
  3. 在行之间或在打开/关闭花括号{}之前/之后不要留太多多余的空间
  4. 不要将Button作为类名来调用,它可能会与java.awt.Button类混淆。
  

它不显示其文本,并且应该执行的操作不会发生

在本课程中:

public class Button extends JButton {
    private String actionName;
    public Button(String actionName) {
        this.actionName = actionName;
        JButton button = new JButton();
        button.setText(actionName);
        button.setSize(30, 30);             
        button.setBounds(5, 5, 25, 25);     

        button.addActionListener(new Evt(this.actionName));
    }
}

您从JButton开始,然后在其中创建了JButton!因此,您有2个JButtons,一个是类的(继承的),另一个是您在其中创建的。但是,您要将文本设置为在内部创建的文本,但是将另一文本(无文本)添加到JFrame中。

在一个比喻中,它就像:

  • 您在页面中写了一些东西
  • 您将获得一个新的白页并将其添加到您的书中,而不是将您写的那一页添加到书中。

您无需在当前程序中扩展JButton,只需创建一个新的JButton实例即可。

否则,如果您确实要使用自定义JButton类,请执行以下操作:

public class MyCustomButton extends JButton { // Change class name
    private String actionName;
    public MyCustomButton(String actionName) {
        super(actionName); //Sets the text
        this.actionName = actionName;

        button.addActionListener(new Evt(this.actionName));
    }
}

答案 1 :(得分:0)

您唯一真正缺少的是在HomeFrame构造函数中调用setVisible(true)。这实际上是启动UI事件线程并显示您的组件的方法。但是,您可能还应该调用pack(),以便您的框架不会仅显示框架装饰。代码:

public class HomeFrame extends JFrame {

    public HomeFrame(String title) {
        super(title);
        this.setLayout(new FlowLayout(FlowLayout.CENTER));
        Button test = new Button("noAction");
        Container cont = getContentPane();
        cont.add(test, BorderLayout.CENTER);
        pack();            /* Optional */
        setVisible(true);  /* Critical */ 
    }
} 

有几种方法可以使此UI代码现代化,但这至少应使其显示出来。

答案 2 :(得分:-1)

由于您没有向其添加任何特定属性,因此您实际上不需要创建JButton的子类。 相反,您应该能够以这种方式使其工作:

public class HomeFrame extends JFrame{

    private static final String BUTTON_ACTION_NAME = "myActionName";

    public HomeFrame(String title) {
        super(title);

        this.setLayout(new FlowLayout(FlowLayout.CENTER));
        JButton test = new JButton();
        test.setText(BUTTON_ACTION_NAME);
        test.setSize(30, 30);             
        test.setBounds(5, 5, 25, 25);     
        test.addActionListener(new Evt(BUTTON_ACTION_NAME));
        Container cont = getContentPane();
        cont.add(test, BorderLayout.CENTER);
    }
}