我的程序中包含JDialogs
,JFileChoosers
和其他包含JButtons
的组件。
我知道我可以从JButton
转到JButton
并设置.focusPainted(false)
以使焦点不可见,但问题是我有一堆“自动”创建的组件(预定义的JDialogs ,JFileChoosers),我无法访问他们的JButton。我必须手动创建整个组件才能控制它们的子组件(并且从头开始创建fileChooser一定很困难)...
然而,我有一个想法。每次创建JButon时,focusPainted
默认设置为true
。有没有办法找到Java库包含原始的JButton构造函数,并将方法更改为false
,使其成为默认值?
编辑:我找到了src.zip并解压缩了AbstractButton.java。如何编辑和重新编译它?
实际上,问题是,如何编辑Java标准库?
P.S。你们所有人都说这不是一个好习惯,这个具体例子可能出现什么问题(我不认为JSL中的任何内容取决于焦点是否在Jbutton上绘制)?我总是可以同时处理两个项目,一个是原始库,一个是编辑过的,当我在一个项目中出错,但在另一个项目中出错时,我知道问题出在哪里。
答案 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中的按钮,文件对话框等中删除焦点矩形。