尽管有Nimbus的弱点,我一直在努力将Java应用程序从WindowsLookAndFeel过渡到Nimbus,主要是成功的.我的用户总体上喜欢Nimbus LaF,但不喜欢一些细节,其中一些我通过咨询本网站上的问题而改变了.示例:我从Windows LaF(他们喜欢)复制了LeafIcon,ClosedIcon和OpenIcon,并在Nimbus版本中使用它们,以获得LaF的良好组合.
坚持最后一个(?)问题.
我有一个带有子类DefaultCellRenderer的JTree来创建适当的节点显示.这在WindowsLookAndFeel下工作正常.
问题:在WindowsLaF下,当选择节点时,节点的文本会突出显示,并且效果在视觉上易于理解.在Nimbus下选择一个节点时,突出显示是用一条(相当暗的)颜色条来完成的,它运行树窗的宽度(不仅仅是文本的宽度),效果令人不安.
所以:我只想在Nimbus LaF中使用WindowsLaF处理JTree节点突出显示(即彩色背景只有文本的宽度,最好是我可以选择的更好的颜色).我怀疑这意味着我需要将正确的排序画家分配给"Tree:TreeCell [Focused + Selected] .backgroundPainter",但我不知道如何编写它.
建议最受欢迎.
编辑
使用Java 7查看奇怪的选定节点突出显示!

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(); …Run Code Online (Sandbox Code Playgroud) 如果在Windows上设置大字体(例如,125%,120 DPI),则看起来好像Swing of Java 9首先渲染为较小的图像,然后将此图像缩放到屏幕上.
文本仍然正确显示.但是1像素线是1像素或2像素强.对角线是阶梯式的.图标被栅格化.
是否有任何命令行参数或API来改变这种行为?
示例编辑:
使用MenuSelectionManagerDemo来自docs.oracle.com/javase/tutorial/uiswing/examples/components/
我有一个带有JSplitPane的JFrame,它是OneTouchExpandable.我想记住JFlitPane在JFrame上的最后一个Divider位置处理,如果重新打开JFrame,则恢复Position.
它运行良好,但是如果用户通过oneTouchExpandable UI-Widget扩展一侧,那么我只存储处理中的'int'-Position并再次设置'int'-Position,结果是JFrame调整JSplitPane-Divider的大小跳转到折叠的Component preferredSize.
如何获取/设置崩溃/展开状态?
编辑
现在:调整大小行为是正常的,但它与第一次打开的行为不完全相同 - 因为现在我没有MinimumDividerLocation.我想要SnapIn,但需要进一步折叠状态.
public class SplitPaneState {
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
new SplitPaneState().createAndSowGUI();
}
});
}
private int position = -1;
private Dimension size = new Dimension( 500, 300 );
private void createAndSowGUI() {
final JFrame frame = new JFrame("frame");
frame.setSize( 200, 100 );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLocationRelativeTo( null );
frame.getContentPane().add( new JButton( new AbstractAction(){
{
putValue( Action.NAME, "Open Dialog" ); …Run Code Online (Sandbox Code Playgroud) 我有一个Select残疾Option谁是默认选择的一个:
<select name="select" size="1">
<option>0</option>
<option selected disabled>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
Run Code Online (Sandbox Code Playgroud)
如果我选择了它,它将返回1.一切还好.
但是如果我打开弹出窗口并将光标悬停在另一个上Option (例如'4')
并ESC通过点击其他任何地方取消它.
该Select输入显示旧值1,但返回上得到选择4.
Chrome仅FireFox(4/5)不会发生这种情况
JTableHaeder默认没有"按下"突出显示.(雨云)
NimbusDefaults表示它有一个默认的[Pressed]背景画家.
当我点击TableHeader时,我该怎么办?

更新1
在NimbusStyle.getExtendedState返回压在鼠标按下正确.但是NimbusStyle.getBackgroundPainter(SynthContext)返回null导致CacheKey "backgroundPainter $$实例"null的NimbusStyle.Values缓存中存在此状态.
有什么问题?
更新2
我的示例显示了一个JTableHeader和一个带有"Pressed Behavior"的JScrollBar.
对于JScrollBar,我putClientProperty( "Nimbus.State" )使用重绘问题.
public class Header extends JPanel{
public Header() {
super(new BorderLayout());
JTableHeader header = new JTable(5, 3).getTableHeader();
JScrollBar scroll = new JScrollBar(JScrollBar.HORIZONTAL);
add(header, BorderLayout.NORTH);
add(scroll, BorderLayout.SOUTH);
scroll.addMouseListener( new PressedBehavior() );
header.addMouseListener( new PressedBehavior() );
}
static public void main( String[] s ) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() …Run Code Online (Sandbox Code Playgroud) 我有一个实现,HttpSessionListener使用sessionDestroyed方法释放应用程序中的"锁定"资源.
"锁定"信息在数据库中维护,并且在大多数情况下锁的发布工作正常.但在某些情况下,我仍然看到资源被锁定 - 即使没有活动的会话!
所以,我怀疑是否有可能sessionDestroyed不被调用?假设会话超时 - 是否sessionDestroyed会调用方法?
假设用户关闭浏览器选项卡而不注销(销毁会话) - 那么是否会调用侦听器?
提前致谢!
public class Empty {
public static void main( String[] args ) {
TreeSet<Class> classes = new TreeSet<Class>();
classes.add( String.class );
String test = new String();
try{
if( classes.contains(test.getClass()) ){
System.out.println( "contains" );
}
}catch(ClassCastException cce){
System.out.println( "Expected: " + classes );
System.out.println( "But it was: " + test.getClass() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这会抛出ClassCastException?
我有一个hashMap,它具有以下值作为密钥value(sql date , integer)对:
a.put("31-05-2011",67);
a.put("01-06-2011",89);
a.put("10-06-2011",56);
a.put("25-05-2011",34);
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下键对hashMap进行排序时:Map modified_a = new TreeMap(a); 并按如下方式显示按键:
01-06-2011,10-06-2011,25-05-2011, 31-05-2011
Run Code Online (Sandbox Code Playgroud)
但我希望按键排序为
31-05-2011,25-05-2011,01-06-2011 ,10-06-2011
Run Code Online (Sandbox Code Playgroud)
我可以看到值是根据前2位数(这是日期值)进行排序的,但是我还要考虑月份值,并根据月份排序,然后按月对每个月进行排序.任何线索?
我有一个com.google.gwt.i18n.client.Messages可本地化的GWT项目的实现.
但似乎不可能重载方法.这是一个Bug还是有原因的?
public interface CommonMessages extends Messages {
public static final CommonMessages INSTANCE = GWT.create( CommonMessages.class );
@DefaultMessage( "The entered text \"{0}\" contains the illegal character(s) \"{1}\" ." )
String textValidatorError( String o, String e );
@DefaultMessage( "The entered text \"{0}\" contains illegal character(s)." )
String textValidatorError( String o );
}
Run Code Online (Sandbox Code Playgroud)
提出来:
Rebinding common.client.i18n.CommonMessages
[java] Invoking generator com.google.gwt.i18n.rebind.LocalizableGenerator
[java] Processing interface common.client.i18n.CommonMessages
[java] Generating method body for textValidatorError()
[java] [ERROR] Argument 1 beyond range of arguments: The entered …Run Code Online (Sandbox Code Playgroud) 我想更改FireFox中具有默认蓝色背景和白色前景的悬停Select-Option的颜色.
我试过了:
<select name="select" size="1">
<option>0</option>
<option class="test">1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
Run Code Online (Sandbox Code Playgroud)
.test:hover {
color:green;
background-color:yellow;
text-decoration:underline;
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.见例子.
FireFox特定解决方案就足够了.