默认情况下,JTableHaeder没有“按下”高亮显示。(尼姆布斯)
NimbusDefaults说,它有一个默认的按下背景画家。
当我点击TableHeader时,我应该怎么做才能看到这个呢?

更新1
NimbusStyle.getExtendedState正确地返回按下的mouseDown。但是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();
}
}
}发布于 2011-05-04 14:27:04
从技术上讲,您需要呈现组件上的状态,而不是JTableHeader本身的状态:
@Override
public void mousePressed( MouseEvent e ) {
JComponent source = (JComponent)e.getComponent();
source.putClientProperty( "Nimbus.State", "Pressed" );
if (source instanceof JTableHeader) {
((JComponent) ((JTableHeader) source).getDefaultRenderer())
.putClientProperty("Nimbus.State", "Pressed");
}
}因此,问题是对所有列都使用相同的实例(呈现组件),因此,如果拖动一列,则显示所有按下的.
编辑:忍不住要挖一点.尼姆布斯太.说得温和些,是缺乏的;-)
事实证明,默认值确实有按下的样式,缺少的是设置它的逻辑。可能不是很简单,因为逻辑(又名: MouseListener)驻留在BasicTableHeaderUI中,它不知道子类的画家状态。逻辑支持的唯一东西(热针固定)是滚动意识,而不是压紧。
虽然我们不能连接到逻辑(嗯,我们可以.但这是另一个窍门:-)我们可以查找JTableHeader中的拖放can /resizingColumn(未绑定)属性等次要状态更改,并允许自定义呈现器酌情更新自己。以下是如何做到的一条线:
public static class WrappingRenderer implements TableCellRenderer {
private DefaultTableCellHeaderRenderer delegate;
private JTableHeader header;
public WrappingRenderer(JTableHeader header) {
this.header = header;
this.delegate = (DefaultTableCellHeaderRenderer) header.getDefaultRenderer();
header.setDefaultRenderer(this);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component comp = delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
TableColumn draggedColumn = table.getTableHeader().getDraggedColumn();
if (draggedColumn != null) {
if (table.convertColumnIndexToModel(column) == draggedColumn.getModelIndex()) {
setNimbusState("Pressed");
} else {
setNimbusState(null);
}
} else {
setNimbusState(null);
}
// do similar for resizing column
return comp;
}
public void setNimbusState(String state) {
delegate.putClientProperty("Nimbus.State", state);
}
}https://stackoverflow.com/questions/5803863
复制相似问题