JTableHaeder по умолчанию не имеет подсветки «нажато». (Нимбус)
NimbusDefaults говорит, что у него есть фоновый рисовальщик [Pressed] по умолчанию.
Что мне делать, чтобы увидеть это, когда я нажимаю на TableHeader?
ОБНОВЛЕНИЕ 1
NimbusStyle.getExtendedState
правильно возвращает PRESSED на mouseDown. Но NimbusStyle.getBackgroundPainter(SynthContext)
возвращает null
, потому что в кеше NimbusStyle.Values
есть null
для "backgroundPainter$$instance" CacheKey с этим состоянием.
Что не так?
ОБНОВЛЕНИЕ 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();
}
}
}