为什么我的自定义JButton不显示它的名字?

时间:2014-04-06 17:38:08

标签: java swing jbutton

您好我正在处理一个项目,我在添加JButton时遇到了问题。出于某种原因,它不会打印它的名字。

这个类应该添加自定义按钮

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

public class FightPanel extends JPanel {

public static final int WIDTH = 600;
public static final int HEIGHT = 600;

public FightPanel() {
    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    setLayout(new BorderLayout());

    FightButton test = new FightButton("test");
    add(test);
}
}

此类是自定义按钮类

import javax.swing.JButton;

public class FightButton extends JButton {

private String name;

public FightButton(String name) {
    this.name = name;
    setName(name);
}

}

2 个答案:

答案 0 :(得分:3)

您所做的只是设置新类的非显示属性,并保持原始父类的名称状态不变。解决方案:使用超级构造函数来帮助您:

public FightButton(String name) {
    super(name);
}

事实上,你的FlightButton确实没有必要有一个名字字段,因为所有这一切都影响了JButton的名字字段。事实上,如果这是你添加到FlightButton的全部内容,我将摆脱这个类并简单地使用JButton对象。我自己,这就是我通常做的事情 - 使用普通的香草JButtons, 但是 使用自定义的AbstractActions,我觉得这可能是你应该去的地方。


修改
您在评论中说明:

  

谢谢你我现在知道你必须使用超级构造函数来做到这一点。

您不必这样做,因为您也可以使用setter方法等,但如果您希望构造函数的行为类似于JButton的类似构造函数,那么最好使用父级' s构造函数。


编辑2
例如:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class FightPanel extends JPanel {

   public static final int FP_WIDTH = 600;
   public static final int FP_HEIGHT = 600;

   public FightPanel() {
      setLayout(new BorderLayout());

      JButton test = new JButton(new FightAction("Test", KeyEvent.VK_T));
      add(test);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(FP_WIDTH, FP_HEIGHT);
   }

   private static void createAndShowGui() {
      FightPanel mainPanel = new FightPanel();

      JFrame frame = new JFrame("FightPanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class FightAction extends AbstractAction {
   public FightAction(String name, int mnemonic) {
      super(name);
      putValue(MNEMONIC_KEY, mnemonic);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      System.out.println(e.getActionCommand() + " pressed!");
   }
}

答案 1 :(得分:3)

setName()方法不控制按钮上显示的文本。它基本上只是由应用程序代码用来标识组件。

setText(...)用于设置按钮中显示的文字。

  

现在知道你必须使用超级构造函数来做到这一点。

您不必这样做,但这是最简单的方法,因为您将文本作为参数传递给您的班级。

如果要在创建组件后更改文本,则可以使用setText()方法。