Java 目视指示可聚焦JLabel在不同LAF上的焦点

Java 目视指示可聚焦JLabel在不同LAF上的焦点,java,swing,focus,jlabel,Java,Swing,Focus,Jlabel,我已经创建了一些可聚焦的jlabel,并希望直观地指示其中一个何时具有聚焦,以保持其与当前外观一致 我想到的最接近这一点的是JCheckBox和JButton焦点指示器,但我找不到它们的定义位置。我本以为它们可以通过LAF默认值访问,但事实似乎并非如此。camickr提到这些甚至不是边界。那么它们是什么呢?它们是以完全依赖于实现的方式绘制的吗 如何在不同的平台上模拟JCheckBox或JButton的焦点指示器,以获得JLabel?我目前使用的是label.setboorder(UIManage

我已经创建了一些可聚焦的
jlabel
,并希望直观地指示其中一个何时具有聚焦,以保持其与当前外观一致

我想到的最接近这一点的是
JCheckBox
JButton
焦点指示器,但我找不到它们的定义位置。我本以为它们可以通过LAF默认值访问,但事实似乎并非如此。camickr提到这些甚至不是边界。那么它们是什么呢?它们是以完全依赖于实现的方式绘制的吗

如何在不同的平台上模拟
JCheckBox
JButton
的焦点指示器,以获得
JLabel
?我目前使用的是
label.setboorder(UIManager.getBorder(“List.focusCellHighlightBorder”)
,但这在某些LAF上看起来还不错

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类JButtonFocusBorder扩展了JFrame{
私人JPanel小组;
私有JTextField textfield1;
私人JLabel标签1;
私有JTextField textfield2;
私人JLabel标签2;
私人JCheckBox checkbox1;
私人按钮;
公共JButtonFocusBorder(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的BorderLayout());
初始化组件();
label1.setBorder(BorderFactory.createEmptyByOrder(1,1,1,1));
label2.SetBeOrder(BorderFactory.CreateEmptyByOrder(1,1,1,1));
标签1.设置聚焦(真);
label2.设置聚焦(真);
FocusListener FocusListener=new FocusAdapter(){
@凌驾
获得公共无效焦点(焦点事件e){
JLabel=(JLabel)e.getSource();
//正在寻找替代品吗
label.setboorder(UIManager.getBorder(“List.focusCellHighlightBorder”);
}
@凌驾
公共无效焦点丢失(焦点事件e){
JLabel=(JLabel)e.getSource();
label.setboorder(BorderFactory.createEmptyBorder(1,1,1,1));
}
};
标签1.addFocusListener(focusListener);
label2.addFocusListener(focusListener);
MouseListener MouseListener=新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
JLabel=(JLabel)e.getSource();
label.requestFocusInWindow();
}
};
标签1.添加mouseListener(mouseListener);
标签2.添加mouseListener(mouseListener);
包装();
可设置大小(假);
setLocationRelativeTo(空);
}
私有组件(){
panel=newJPanel(newGridBagLayout());
添加(面板);
gridbaggbc;
label1=新的JLabel(“Field1:”);
gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
面板。添加(标签1,gbc);
textfield1=新的JTextField(20);
gbc=新的GridBagConstraints();
gbc.gridx=1;
gbc.gridy=0;
面板.添加(文本字段1,gbc);
label2=新的JLabel(“Field2:”);
gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=1;
面板。添加(标签2,gbc);
textfield2=新的JTextField(20);
gbc=新的GridBagConstraints();
gbc.gridx=1;
gbc.gridy=1;
面板.添加(文本字段2,gbc);
checkbox1=新的JCheckBox(“checkbox1”);
gbc=新的GridBagConstraints();
gbc.gridx=1;
gbc.gridy=2;
面板。添加(复选框1,gbc);
按钮=新按钮(“应用”);
gbc=新的GridBagConstraints();
gbc.gridx=1;
gbc.gridy=3;
面板。添加(按钮,gbc);
}
公共静态void main(字符串[]args)抛出
ClassNotFoundException,不受支持的LookandFeelException,
实例化异常,非法访问异常{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新建JButtonFocusBorder().setVisible(true);
}
});
}
}

备注:这个问题与我的一个现有问题相关,并解释了我为什么想要可聚焦标签。

并且通过在屏幕上使用Nimbus L&F内容跳转(聚焦放大JLables绑定,未格式化的标签被接受,由LayoutManager重新绘制),你必须使用清空命令来避免那些有趣的重画artefacts@mKorbel,这是因为在Nimbus
列表中。focusCellHighlightBorder
边框可能与示例中我(已经)创建的
EmptyOrders
大小不同。就像我说的,只对一些LAF有效。边框可能与EmptyByOrders的大小不同?=插图,2。标签,JCheckBox的描述没有任何边框,3。对于JButtonComponents使用ButtonModel中的事件(或者在JButtons/AbstractButton API中正确地实现相同的事件),使用JButton可能更容易