2

我有一个程序,JDialogs其中JFileChoosers包含很多JButtons.

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

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

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

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

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

4

2 回答 2

0

通过子类化您当前使用的外观来创建自定义外观。定义两个类就足够了:外观本身和按钮 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 中的按钮、文件对话框等中删除焦点矩形。

于 2012-09-13T10:59:26.563 回答
0

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

public class MyButton extends JButton{

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

}

但我明白了,这不会改变对 FileChooser 按钮的关注。

于 2012-09-12T11:27:20.797 回答