2011-04-27 4 views
6

JTableHaeder에는 기본적으로 '누른'강조 표시가 없습니다. (Nimbus)Nimbus TableHeader가 'pressed'로 강조 표시되지 않았습니다.

NimbusDefaults에는 기본 [Pressed] 백그라운드 페인터가 있다고 나와 있습니다.

내가 TableHeader를 클릭하면 어떻게해야합니까?

NimbusDefaultPainter


UPDATE 1

NimbusStyle.getExtendedState 반환은 제대로 mouseDown에 눌렀습니다. 그러나 NimbusStyle.getBackgroundPainter(SynthContext)null을 반환합니다.이 상태의 CacheKey "backgroundPainter $$ instance"에 대한 NimbusStyle.Values 캐시에 null이 있으므로 원인이됩니다.

무엇이 잘못 되었나요?


UPDATE 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(); 
     } 
    } 
} 

답변

3

기술적으로, 당신은, 렌더링 구성 요소에 그 상태를 필요로하지 않는 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"); 
     } 
    } 

문제 다음 (렌더링 구성 요소) 같은 인스턴스 그래서, 모든 컬럼에 사용되는 것입니다 모든 누르면 나타나는 열을 ... 드래그하면

편집 : ... 후광이 soooo는 ... 부족한 조금 파고 저항 할 수 ;-)

이 밝혀 약간을 넣어 기본값에 실제로 눌려진 스타일이 있고, 누락 된 것은 설정하는 로직입니다. 아마도 로직 (일명 : MouseListener)이 서브 클래스의 화가 상태에 대해 알지 못하는 BasicTableHeaderUI에 상주하기 때문에 아마도 그리 간단하지 않을 것입니다. 논리가 지원하는 유일한 것 (바늘 고침)은 전복 인식이지만 압박은 아닙니다.

우리가 논리에 연결할 수는 없지만 (물론, 우리가 할 수있는 또 다른 트릭입니다 .-) JTableHeader의 column/resizingColumn (바인딩되지 않은) 속성을 드래그하는 것과 같은 2 차적 상태 변경을 찾아서 커스텀 렌더러는 자동으로 적절하게 업데이트됩니다. 다음은 사용 방법에 대한 설명입니다.

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); 
    } 
} 
+0

내 경우에는 드래그 할 수 없습니다. yy – oliholz

+0

@oliholz ​​끌기는 눌려진 열 밖에서 그림을 그리기 위해 렌더러를 다시 사용하는 예일뿐입니다 .- 어떤 이유로 든 발생할 수 있습니다. 반쯤 강력하게하려면 편집 된 답변에서 wrappingRenderer와 같은 것이 필요할 것입니다. – kleopatra

관련 문제