使JButton中的文本不可见

4
我制作了一个按钮并对其执行了 .setText() 操作,因为我必须将 .setText() 的值与其他内容进行比较。
我将 .setText() 应用于 JButton 上,但是我不希望文本在我的按钮上可见。如果我执行 setVisible(false),那么整个按钮都会隐藏,但我只想隐藏文本。
是否有这样的选项?我考虑过制作自定义字体并将其应用于 .setText() 中的文本,但我想知道是否有更有效的解决方案。
提前感谢大家。
注:我无法使用 .setText(" "),因为我需要比较其中的值。

1
如果您想隐藏文本并保留按钮可见,请使用空格作为文本。但是,这很可能会让您的应用程序用户感到困惑。也许仅仅使用文本来识别按钮只是一种解决方法。您想通过隐藏文本来实现什么目的?为什么需要比较按钮的文本?您考虑过其他选项吗? - harpun
1
为什么不简单地使用 setText(" ")?与其比较文本,我更愿意比较JButton(或者更好的是它的Action) 的 actionCommand字符串。 - Hovercraft Full Of Eels
如果你改变程序的逻辑,会遇到更少的问题,所以你不应该用那种方式进行比较。请参考@Hovercraft的答案。 - Igor Rodriguez
5个回答

7
您说:
编辑:我不能使用.setText(" "),因为我必须比较其中的值。
这是无稽之谈。正如我在评论中提到的那样,将JButton的文本设置为" ",不要使用JButton的文本进行比较。而是使用其通过getActionCommand()轻松获取的actionCommand。或者使用HashMap。
当您需要更改JButton的行为和状态时,可以考虑更改JButton的Action,这可以通过调用setAction(...)轻松完成。
例如,
import java.awt.event.ActionEvent;
import javax.swing.*;

public class ButtonActions {

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

      JButton myButton = new JButton();

      StartAction startAction = new StartAction();
      PauseAction pauseAction = new PauseAction();
      BlankAction blankAction = new BlankAction();

      startAction.setNextAction(pauseAction);
      pauseAction.setNextAction(blankAction);
      blankAction.setNextAction(startAction);

      myButton.setAction(startAction);
      mainPanel.add(myButton);

      JFrame frame = new JFrame("ButtonActions");
      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 SwappingAction extends AbstractAction {
   private Action nextAction;

   public SwappingAction(String text) {
      super(text);
   }

   public void setNextAction(Action nextAction) {
      this.nextAction = nextAction;
   }

   public Action getNextAction() {
      return nextAction;
   }

   @Override
   /**
    * super method needs to be called in child for swap to work
    */
   public void actionPerformed(ActionEvent e) {
      System.out.println("ActionCommand: " + e.getActionCommand());
      ((AbstractButton)e.getSource()).setAction(nextAction);
   }
}

class StartAction extends SwappingAction {
   public static final String START = "Start";

   public StartAction() {
      super(START);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      super.actionPerformed(e);
      // start-specific code goes here
   }
}

class PauseAction extends SwappingAction {
   public static final String PAUSE = "Pause";

   public PauseAction() {
      super(PAUSE);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      super.actionPerformed(e);
      // pause-specific code goes here
   }
}

class BlankAction extends SwappingAction {
   public static final String BLANK = " ";

   public BlankAction() {
      super(BLANK);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      super.actionPerformed(e);
   }
}

或者他可以使用setName(String)方法来设置名称。显然,比较“text”属性并不是一个好的方式... - Igor Rodriguez
我还没学会怎么使用那些。我可能在比较时犯了一个大错误,但目前它能正常工作,而且我没有时间重写那部分(也因为我目前的知识不足)。我想我的唯一解决办法就是创建一个自定义字体? - Glenndisimo
@Glenndisimo:不,那个方案是一个权宜之计。请查看编辑的示例。 - Hovercraft Full Of Eels
非常感谢!现在更有意义了,我会重写我的部分。谢谢! - Glenndisimo

0

编写 buttonName.setText(" ") 这将不会在按钮上显示任何名称。每当您想要显示名称(在任何事件上)时,请再次设置它 buttonName.setText("some text")


我知道("")不会显示任何文本,但是出于比较的原因,我必须有.settext来设置一个值。但我不希望最终用户看到这个值。 - Glenndisimo

0

是的,但问题在于通过按按钮背景会发生变化。 - Glenndisimo
这是你必须在鼠标事件中处理的。请查看https://dev59.com/4WUq5IYBdhLWcg3wSOfS - Ravindra Gullapalli
如果您设置了JButton的背景颜色,则会失去该按钮的所有外观和感觉特定图形。@ Glenndisimo:我建议您不要选择这种方法。 - Hovercraft Full Of Eels

-1

为什么不给第一个按钮命名为“ ”(1个空格), 第二个按钮:“ ”(2个空格) 第三个按钮:“ ”(3个空格),以此类推...

现在,比较一下: if((event.getActionCommand()).equals(" ")) { //第一个按钮 }

if((event.getActionCommand()).equals(" ")) { //第二个按钮 }

...以此类推

其中event是ActionEvent对象。

这样,按钮将具有唯一的名称并且不可见。 我知道这种编码方式很糟糕,但它确实能起到作用;)


-2

不要使用 .setText(),而是使用 .setTag() 和 .getTag() 将一些值附加到视图上 - 包括按钮 - 以便稍后检索。

这些方法就是为了这种目的而存在的。


2
这似乎是一个针对Android的答案,而不是Swing的答案。我认为您需要删除您的答案,因为它似乎与原帖作者的问题无关。 - Hovercraft Full Of Eels
抱歉,我忘记检查这个Swing的东西了。然而,虽然我不太了解Swing,但如果JButton没有setTag()/getTag()的等效方法,我会感到惊讶;因为到目前为止我见过的所有框架 - 包括非常古老的XMotif - 都有一种机制可以将用户定义的信息附加到视图/小部件/...无论在该特定框架中使用的名称是什么。 - SylvainL
1
@Sylvain 不幸的是,JButton 没有 setTag()/getTag() 方法。在 Swing API 中最接近的可能是 Component 上提供的 setName() / getName() 方法。 - Jason Braucht
1
经过快速搜索,这里有:JComponent类中的putClientProperty(Object, Object)和getClientPropety(Object)。我还没有找到任何框架不具备其小部件等效的getTag()和putTag()。另外,另一个解决方案是简单地子类化JButton并添加您需要的任何字段/方法,但就个人而言,我更喜欢使用已经存在的内容。 - SylvainL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接