【问题标题】:How to disable JButton without hiding its label?如何在不隐藏标签的情况下禁用 JButton?
【发布时间】:2011-10-03 04:40:04
【问题描述】:

我正在使用 netbeans IDE 用 Ja​​va 开发一个项目,我需要禁用特定的 JButton。为此,我使用以下代码。

IssuBtn.setEnabled(false);

但禁用后它不会在 JButton 上显示文本。如何在 JButton 上保留该文本?

【问题讨论】:

  • setEnabled(false) 不要从按钮中删除文本,您的代码中肯定有其他错误。
  • 能否请您发布 SSCCE (sscce.org),因为这很不寻常。谢谢
  • 通常文本仍然存在,尽管以不同的底纹变灰。你确定不是这样吗?如果是这样,您使用的是什么外观,或者如果您使用的是标准,您使用的是什么操作系统和窗口管理器?
  • 发布反映相同行为的 SSCCE。
  • 请学习java命名约定并遵守它们

标签: java swing jbutton


【解决方案1】:

这个实验表明一个答案是“使用非金属的 PLAF”。

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

class LookOfDisabledButton {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(3,3));
                JPanel pEnabled = new JPanel(new GridLayout(1,0,2,2));
                pEnabled.setBackground(Color.green);
                gui.add(pEnabled, BorderLayout.NORTH);

                JPanel pDisabled = new JPanel(new GridLayout(1,0,2,2));
                pDisabled.setBackground(Color.red);
                gui.add(pDisabled, BorderLayout.SOUTH);

                UIManager.LookAndFeelInfo[] plafs = 
                    UIManager.getInstalledLookAndFeels();
                for (UIManager.LookAndFeelInfo plafInfo : plafs) {
                    try {
                        UIManager.setLookAndFeel(plafInfo.getClassName());
                        JButton bEnabled = new JButton(plafInfo.getName());
                        pEnabled.add(bEnabled);
                        JButton bDisabled = new JButton(plafInfo.getName());
                        bDisabled.setEnabled(false);
                        pDisabled.add(bDisabled);
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        });
    }
}

或者,调整UIManager 中的值。

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

class LookOfDisabledButton {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(3,3));
                JPanel pEnabled = new JPanel(new GridLayout(1,0,2,2));
                pEnabled.setBackground(Color.green);
                gui.add(pEnabled, BorderLayout.NORTH);

                JPanel pDisabled = new JPanel(new GridLayout(1,0,2,2));
                pDisabled.setBackground(Color.red);
                gui.add(pDisabled, BorderLayout.SOUTH);

                // tweak the Color of the Metal disabled button
                UIManager.put("Button.disabledText", new Color(40,40,255));

                UIManager.LookAndFeelInfo[] plafs = 
                    UIManager.getInstalledLookAndFeels();
                for (UIManager.LookAndFeelInfo plafInfo : plafs) {
                    try {
                        UIManager.setLookAndFeel(plafInfo.getClassName());
                        JButton bEnabled = new JButton(plafInfo.getName());
                        pEnabled.add(bEnabled);
                        JButton bDisabled = new JButton(plafInfo.getName());
                        bDisabled.setEnabled(false);
                        pDisabled.add(bDisabled);
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        });
    }
}

正如 kleopatra 所指出的......

这不是一个解决方案,但可能是一个指向寻找解决方案的方向

“它”是我的答案。事实上,我怀疑她在评论中找到了真正的原因:

仅凭猜测:这是由于违反了仅限一瓶的规则。

我同意这个猜测。

【讨论】:

  • 实际上,不(尽管我在检查之前投了赞成票,现在无法删除它:-) - 它看起来更像是来自不完整 (?) plaf 设置的人工制品。如您所见,即使启用的按钮看起来也是错误的。具体来说:如果我按原样运行示例,我会看到与屏幕截图相同的内容。如果我将其更改为仅设置金属(仅 2 个按钮),所有看起来都像预期的那样
  • @kleopatra 我明白你的意思(这是一个相当出乎意料的结果)。 (抓头)知道为什么它会这样吗?至于实际问题,我想它回到了 SkeetOverFlow 的好建议——OP 应该发布一个 SSCCE。
  • 不清楚原因 - 只能猜测:这是因为违反了仅限一瓶的规则。不过,这很不稳定:最后添加金属按钮,一切都很好。这个例子的好处是 OPs 效果 可以 被复制,所以又来了 :-)
  • 您可能想要编辑答案以强调它不是解决方案但可能是指向搜索解决方案方向的指针:-)
  • 完成。希望你不介意我盗用了你的原话,但我想不出更好的表达方式。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2016-03-17
  • 2021-10-18
  • 1970-01-01
  • 2012-07-22
  • 2022-11-24
  • 2018-01-17
相关资源
最近更新 更多