我一直在努力将Java应用程序从WindowsLookAndFeel转换为Nimbus,尽管Nimbus有些小问题,但我已经取得了很大的成功。总体而言,我的用户喜欢Nimbus LaF,但是他们不喜欢一些细节,其中一些我通过参考此网站上的以前的问题来进行更改。例如:我从Windows LaF中复制了LeafIcon、ClosedIcon和OpenIcon(他们喜欢),并将它们用于Nimbus版本,从而实现了两种LaFs的完美结合。
但最后遇到了一个难题:
我有一个JTree,使用子类化的DefaultCellRenderer创建适当的节点显示,对于WindowsLookAndFeel这很好用。
问题在于: 在WindowsLaF下,选择一个节点时,节点的文本会被突出显示,视觉效果很容易理解。但在Nimbus下,选择一个节点时,突出显示是通过一条(相当暗的)颜色栏完成的,该颜色栏跨越整个树窗口的宽度(而不仅仅是文本的宽度),这种效果让人困惑。
因此,我只想在Nimbus LaF中使用WindowsLaF的JTree节点突出显示效果(即仅在文本宽度内具有彩色背景,并且最好是我可以选择的更好颜色)。我认为这意味着我需要将正确的Painter分配给“Tree: TreeCell [Focused + Selected] .backgroundPainter”,但我不知道该如何编写它。
欢迎提供建议。
但最后遇到了一个难题:
我有一个JTree,使用子类化的DefaultCellRenderer创建适当的节点显示,对于WindowsLookAndFeel这很好用。
问题在于: 在WindowsLaF下,选择一个节点时,节点的文本会被突出显示,视觉效果很容易理解。但在Nimbus下,选择一个节点时,突出显示是通过一条(相当暗的)颜色栏完成的,该颜色栏跨越整个树窗口的宽度(而不仅仅是文本的宽度),这种效果让人困惑。
因此,我只想在Nimbus LaF中使用WindowsLaF的JTree节点突出显示效果(即仅在文本宽度内具有彩色背景,并且最好是我可以选择的更好颜色)。我认为这意味着我需要将正确的Painter分配给“Tree: TreeCell [Focused + Selected] .backgroundPainter”,但我不知道该如何编写它。
欢迎提供建议。
public class TreeBorder {
public static void main( String[] args ) {
try{
for( UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels() ) {
if( "Nimbus".equals( info.getName() ) ) {
UIManager.setLookAndFeel( info.getClassName() );
break;
}
}
} catch( Exception e ) {
e.printStackTrace();
}
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setLocationRelativeTo( null );
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.getContentPane().add( getJTree() );
f.pack();
f.setVisible( true );
}
private JTree getJTree() {
JTree jTree = new JTree();
jTree.setCellRenderer( new LocalRenderer() );
return jTree;
}
} );
}
private static class LocalRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus ) {
DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasfocus );
if( true ) {
result.setFont( new JLabel().getFont() );
Icon icon = UIManager.getIcon("FileView.floppyDriveIcon");
result.setIcon( icon );
}
return(result);
}
}
}