Nimbus TableHeader 未突出显示为“按下”;
默认情况下,JTableHaeder 没有“按下”突出显示。 (Nimbus)
NimbusDefaults 说它有一个默认值 [按下]背景画家。
当我单击 TableHeader 时要看到此内容,我该怎么办?
更新 1
NimbusStyle.getExtendedState
返回 mouseDown 上的 PRESSED正确。但是 NimbusStyle.getBackgroundPainter(SynthContext)
返回 null
因为 NimbusStyle.Values
缓存中有一个 null
具有此状态的 CacheKey “backgroundPainter$$instance”。
有什么问题吗?
更新2
我的示例显示了具有“按下行为”的 JTableHeader 和 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() {
JFrame f = new JFrame("Nimbus Pressed Example");
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setBounds( 150, 150, 300, 200 );
f.getContentPane().add( new Header() );
f.setVisible( true );
}
});
} catch( Exception fail ) { /*ignore*/ }
}
private class PressedBehavior extends MouseAdapter {
@Override
public void mouseReleased( MouseEvent e ) {
JComponent source = (JComponent)e.getComponent();
source.putClientProperty( "Nimbus.State", null );
}
@Override
public void mousePressed( MouseEvent e ) {
JComponent source = (JComponent)e.getComponent();
source.putClientProperty( "Nimbus.State", "Pressed" );
//source.invalidate();
//source.repaint();
}
}
}
The JTableHaeder has no 'pressed' highlighting by default. (Nimbus)
NimbusDefaults says it has a default [Pressed] background painter.
What should I do, to see this when i click on the TableHeader?
UPDATE 1
The NimbusStyle.getExtendedState
returns the PRESSED on mouseDown correctly. But the NimbusStyle.getBackgroundPainter(SynthContext)
returns null
cause there is an null
in the NimbusStyle.Values
cache for the CacheKey "backgroundPainter$$instance" with this state.
What is wrong there?
UPDATE 2
My example shows a JTableHeader and a JScrollBar with an 'Pressed Behavior'.
For the JScrollBar my putClientProperty( "Nimbus.State" )
works with a repaint problem.
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() {
JFrame f = new JFrame("Nimbus Pressed Example");
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setBounds( 150, 150, 300, 200 );
f.getContentPane().add( new Header() );
f.setVisible( true );
}
});
} catch( Exception fail ) { /*ignore*/ }
}
private class PressedBehavior extends MouseAdapter {
@Override
public void mouseReleased( MouseEvent e ) {
JComponent source = (JComponent)e.getComponent();
source.putClientProperty( "Nimbus.State", null );
}
@Override
public void mousePressed( MouseEvent e ) {
JComponent source = (JComponent)e.getComponent();
source.putClientProperty( "Nimbus.State", "Pressed" );
//source.invalidate();
//source.repaint();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从技术上讲,您需要渲染组件上的状态,而不是 JTableHeader 本身上的状态:
那么问题是(渲染组件的)同一个实例用于所有列,因此如果您拖动列,所有列都会显示为按下...
编辑:无法忍不住要挖一下……Nimbus 太……缺乏了,温和地说;-)
事实证明,默认值确实有按下的样式,缺少的是设置它的逻辑。可能并不完全微不足道,因为逻辑(又名:MouseListener)驻留在 BasicTableHeaderUI 中,它不知道子类的画家状态。逻辑支持的唯一事情(热针修复)是翻转意识,而不是压力意识。
虽然我们无法挂钩逻辑(好吧,我们可以......但这是另一个技巧:-),我们可以寻找辅助状态更改,例如 JTableHeader 中的 DraggingColumn/resizingColumn (未绑定)属性,并让自定义渲染器自行更新视情况而定。以下是操作方法的概述:
technically, you need that state on the rendering component, not on the JTableHeader itself:
Problem then is that the same instance (of rendering component) is used for all columns, so if you drag a column all appear pressed ...
Edit: couldn't resist to dig a bit ... Nimbus is soooo ... lacking, to put it mildly ;-)
Turns out that the defaults indeed have the styles for pressed, what's missing is the logic to set it. Probably not entirely trivial, because the logic (aka: MouseListener) resides in BasicTableHeaderUI which doesn't know about subclass' painter states. The only thingy the logic is supporting (hot needle fix) is rollover-awareness, but not pressed-ness.
While we can't hook into the logic (well, we could ... but that's another trick :-) we can look for secondary state changes like draggingColumn/resizingColumn (not-bound) properties in JTableHeader and let a custom renderer update itself as appropriate. Here's a line-out of how-to: