【问题标题】:Painted focus on JButtons在 JButtons 上绘制焦点
【发布时间】:2012-09-05 09:40:47
【问题描述】:

我有一个程序,其中包含很多JDialogsJFileChoosers 和其他包含JButtons 的组件。

我知道我可以从 JButton 转到 JButton 并设置 .focusPainted(false) 以使焦点不可见,但问题是我有一堆“自动”创建的组件(预定义的 JDialogs、JFileChoosers),而我无权访问他们的 JButton。我必须手动创建整个组件才能控制它们的子组件(并且从头开始创建 fileChooser 非常困难)......

不过,我有一个想法。每次创建 JButon 时,focusPainted 默认设置为 true。有没有办法我可以找到包含原始 JButton 构造函数的 Java 库并将方法更改为 false ,使其成为默认值?

编辑:我找到了 src.zip 并提取了 AbstractButton.java。如何编辑和重新编译它?

其实问题是,如何编辑Java标准库?

附:你们所有人都说这不是一个好习惯,这个特定的例子可能会出现什么问题(我认为JSL中的任何内容都取决于焦点是否画在Jbutton上)?而且我总是可以同时处理两个项目,一个带有原始库,一个带有已编辑的库,当我在一个中出错但在另一个中没有出错时,我知道问题出在哪里。

【问题讨论】:

  • 您可以使用 -Xbootclasspath 选项替换 java 核心类,但这不是一个好习惯。更多信息 herehere
  • 你为什么要迷惑你的用户?
  • 我经常看到有关对抗 L&F 和默认行为的问题:这是一种不好的做法!平台 L&F 尽可能模拟平台的默认 L&F,以便用户享受与任何其他应用程序类似(如果不完全一样)的实验。问问自己:“为什么我要违背用户的期望?”
  • 您的应用程序是多平台的,或者更准确地说,它是使用不同的外观 (L&F) 还是只使用一种?在后一种情况下,您似乎需要继承 L&F 并禁用焦点矩形的渲染;然后,让应用程序在启动时加载您自定义的 L&F。不过,我自己从来没有做过。
  • 我可以只禁用对默认 Java L&F 的关注吗?我必须承认它看起来相当丑陋。这主要是审美问题。不过,关注其他 L&F 可能看起来更好(但我想让用户在 L&F 之间进行选择)......

标签: java swing jbutton standard-library


【解决方案1】:

如何从JButton 继承并使用您自己的 Button 类,您在使用的构造函数中将 focusPainted 设置为 false。您不想更改标准 Java 代码。

public class MyButton extends JButton{

  public MyButton() {
    super();
    setFocusPainted(false);
  }

}

但是我明白了,这不会改变您的 FileChooser 按钮的焦点。

【讨论】:

    【解决方案2】:

    通过子类化您当前使用的外观来创建自定义外观。定义两个类就足够了:外观本身和按钮 UI 委托。外观应该将按钮委托放入公用表中,替换原来的按钮委托。委托应覆盖绘制焦点矩形的方法并使用一个空方法,以便不绘制焦点矩形。此外,需要覆盖创建委托实例的委托中的静态方法。

    public class MyLookAndFeel extends WindowsLookAndFeel {
    
        protected void initClassDefaults(UIDefaults table){
            super.initClassDefaults(table);
            table.put("ButtonUI","package1.package2.MyButtonUI");
        }
    
    }
    
    public class MyButtonUI extends WindowsButtonUI {
    
        private static MyButtonUI thiz;
    
        public static ComponentUI createUI(JComponent c) {
            if(thiz==null) thiz=new MyButtonUI();
            return thiz;
        }
    
        protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect){}
    
    }
    

    当您的应用程序启动时,激活您的自定义外观:

    UIManager.setLookAndFeel("package1.package2.MyLookAndFeel");
    

    这不仅会从您手动创建的按钮中删除焦点矩形,还会从 JOptionPane 中的按钮、文件对话框等中删除焦点矩形。

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2013-12-31
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      相关资源
      最近更新 更多