【问题标题】:Make text in JButton not visible使 JButton 中的文本不可见
【发布时间】:2013-03-09 22:15:45
【问题描述】:

我做了一个按钮并在上面做了一个.setText(),因为我必须将.setText() 的值与其他值进行比较。

我将.setText() 应用于JButton,但我不希望文本在我的按钮中可见。 如果我这样做setVisible(false),那么它会隐藏整个按钮,但我只希望它隐藏文本。

有这个选项吗?我考虑过制作自定义字体并将其应用于.setText() 中的文本,但我想知道是否有更有效的选择来解决我的问题。

提前谢谢各位。

编辑:我不能使用.setText(" "),因为我必须比较其中的值。

【问题讨论】:

  • 如果您想隐藏空格并让按钮可见,请使用空格作为文本。但是,这很可能会使您的应用程序的用户感到困惑。可能使用文本来识别按钮只是一种解决方法。你想通过隐藏文本来实现什么?为什么需要比较按钮的文本?您是否考虑过其他选择?
  • 为什么不简单地setText(" ")?我不会比较文本,而是比较 JButton(或者更好的是,它的 Action)的 actionCommand 字符串。
  • 你不应该这样比较它。如果您更改程序的逻辑,您将遇到更少的问题。查看@Hovercraft 的答案。

标签: java swing jbutton


【解决方案1】:

你说:

编辑:我不能使用 .setText(" ") 因为我必须比较其中的值。

废话。正如我在评论中提到的,将 JButton 的文本设置为 " ",并且不要使用 JButton 的文本进行比较。而是使用通过 getActionCommand() 轻松获得的 actionCommand。或使用HashMap<JButton, SomethingElse>

当您需要更改 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)设置名字。显然,比较“文本”属性并不是一个好办法……
  • 我还没有学会如何使用它们。我可能在使用 .settext 进行比较时犯了一个大错误,但目前它正在工作,我没有时间重写那部分(也是因为我此时没有足够的知识)。我认为我唯一的解决方案是创建自定义字体?
  • @Glenndisimo:不,该解决方案是一个杂项。不要这样做。请以编辑为例。
  • 非常感谢!更有意义,要重写我的部分。谢谢!
【解决方案2】:

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

【讨论】:

  • 我知道 ("") 不显示任何文本,但出于比较原因,我必须让 .settext 具有值。但我只是不希望最终用户可以看到该值
【解决方案3】:

如果您坚持不使用setText(""),请尝试设置与背景颜色和文本颜色相同的颜色。检查以下链接

setBackground(java.awt.Color)

setForeground(java.awt.Color)

【讨论】:

  • 是的,但问题是按下按钮后背景会发生变化
  • 你必须在鼠标事件中处理。看看stackoverflow.com/questions/14627223/…
  • 如果您设置了 JButton 的背景颜色,您将失去该按钮的所有外观和感觉特定图形。 @Glenndisimo:我建议你不要走这条路。
【解决方案4】:

为什么不将第一个按钮命名为“”(1 个空格)。 第二个:“”(2个空格) 第三个:“”(3个空格)等等..

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

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

..等等

其中 event 是 ActionEvent 的对象

这样按钮将具有唯一的名称并且不可见。 可怕的编码,我知道。但它确实有效;)

【讨论】:

    【解决方案5】:

    使用 .setTag() 和 .getTag() 代替 .setText() 将一些值附加到视图 - 包括按钮 - 以供以后检索。

    这些方法直接用于那种目的。

    【讨论】:

    • 这看起来是 Android 答案而不是 Swing 答案。我认为您会想要删除您的答案,因为它似乎与原始发帖人的问题无关。
    • 对不起,我忘了检查这个 Swing 东西。然而,虽然我对 Swing 了解不多,但如果 JButton 没有等效的 setTag()/getTag(),我会感到惊讶;到目前为止,我见过的所有框架(包括非常古老的 XMotif)都具有将用户定义的信息附加到视图/小部件/...的所有机制,无论该特定框架中使用的名称是什么。
    • @Sylvain 不幸的是JButton 没有setTag()/getTag()。 Swing API 中提供的最接近的东西可能是Component 上的setName() / getName() 方法
    • 快速搜索后,它们是:JComponent 类中的 putClientProperty(Object, Object) 和 getClientPropety(Object)。我还没有找到任何没有 getTag() 和 putTag() 等价物的框架。此外,另一种解决方案是简单地将 JButton 子类化并添加您需要的任何字段/方法,但就个人而言,我更喜欢使用已经存在的内容。
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2013-03-14
    • 2012-04-15
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多