被绘的焦点在JButtons

时间:2012-09-12 11:21:08

标签: java swing jbutton standard-library

我的程序中包含JDialogsJFileChoosers和其他包含JButtons的组件。

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

public class MyButton extends JButton{

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

}

但是我知道,这不会改变你对FileChooser按钮的关注。

答案 1 :(得分: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中的按钮,文件对话框等中删除焦点矩形。