2012-02-21 4 views
3

커스텀 TableCellRenderer를 가지는 JTable가 있습니다.Look & Feel 갱신 후의 JTable의 갱신

public class DateCellRenderer extends DefaultTableCellRenderer { 

    private static final long serialVersionUID = 58L; 

    public DateCellRenderer() { 
     super(); 
     setHorizontalAlignment(CENTER);  
     setOpaque(true); 
    } 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {   
     if (value instanceof Date) { 
      String date = new SimpleDateFormat("dd-MM-yyyy").format((Date) value); 
      setText(date); 
     } 
     return this; 
    } 
} 

또한 내 응용 프로그램에는 모양과 느낌을 변경할 수있는 드롭 다운 메뉴가 있습니다. 이 드롭 다운 메뉴는 상위 프레임에 있으며 테이블은 대화 상자에 있습니다. 대화 상자가 열리면 상위 프레임에 액세스 할 수 없습니다. 그래서 룩앤필을 바꾸려면 먼저 대화 상자를 닫아야합니다.

테이블이 일부 데이터로 채워진 경우 특정 스킨에서 상위 프레임의 모양과 느낌을 변경하고 다시 대화 상자를 열고 TableCellRenderer를 추가 한 열은 이전 모양과 느낌을 유지합니다. . 다른 열이 새로운 모양과 느낌으로 렌더링되는 동안은 업데이트되지 않습니다.

문제점 및 해결책을 찾을 수 없습니다. 어떤 도움을받을 수 있습니다.

참고 : 응용 프로그램의 모양과 느낌 업데이트는 사전에 다음 코드에 의해

javax.swing.UIManager.setLookAndFeel(uiProperties.getThemeModel().getThemeClass()); 
ComponentFactory.getLibraryFrame().getRootPane().updateUI(); 
for (int i = 0; i < Frame.getWindows().length; i++) { 
    SwingUtilities.updateComponentTreeUI(Frame.getWindows()[i]); 
} 
for (int i = 0; i < Frame.getFrames().length; i++) { 
    SwingUtilities.updateComponentTreeUI(Frame.getFrames()[i]); 
} 

감사한다. enter image description here

가 그럼 난 빠른에 테마를 변경하고, 두 번째 열은 업데이트되지는 UI "출시": 하이파이 테마에서

먼저 선택 enter image description here

JTable로는 다음과 같습니다

public class MovieSearchResultTable extends BaseTable { 

    private static final long serialVersionUID = 45L; 

    public MovieSearchResultTable(TableModel tableModel) { 
     super(tableModel); 
     LibraryLogger.initMessage(getClass().getSimpleName()); 
    } 

    @Override 
    public void initialize() { 
     setFillsViewportHeight(true); 
     setAutoResizeMode(AUTO_RESIZE_OFF); 
     getColumnModel().getColumn(1).setCellRenderer(new DateCellRenderer());//if I comment out this line then no problem. but without CellRenderer how could I format a Date, if I use formatted String instead of Date, then the column will not sort!! 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() { 
     return getPreferredSize().getWidth() < getParent().getWidth(); 
    } 
} 
+0

Look & Feel에서 – mKorbel

+0

jtatoo - http://www.jtattoo.net/을 사용하고 있습니다. 그것은 하위 모양을 가지고 있으며, HiFi, Fast, Acryl, Aero 등의 느낌을줍니다.드롭 다운은 이러한 테마 목록으로 구성됩니다. –

+0

지금 당장 귀하의 질문은 분명하지만 코드가 없으면 몇 가지 문제가 발생합니다 ..... 또는 사진이 꽤 un_answerable 인 경우 JTatoo ○ 테마를 변경하려고 시도 했습니까? – mKorbel

답변

2

솔루션에 대한 API에게의를 다운로드 JMenu에 모든 것을 시도 수업 :

public class MovieSearchResultTable extends BaseTable { 

    private static final long serialVersionUID = 45L; 

    private int rolloverRowIndex = -1; 

    public MovieSearchResultTable(TableModel tableModel) { 
     super(tableModel); 
     LibraryLogger.initMessage(getClass().getSimpleName()); 
    } 

    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component component = super.prepareRenderer(renderer, row, column); 
     Color foreground = getForeground(); 
     Color background = getBackground(); 
     if (isRowSelected(row)) { 
      foreground = getSelectionForeground(); 
      background = getSelectionBackground(); 
     } 
     else if (row == rolloverRowIndex) { 
      foreground = getSelectionForeground(); 
      background = ColorHelper.brighter(getSelectionBackground(), 40); 
     } 
     else if (row % 2 == 0) { 
      background = ColorHelper.brighter(getParent().getBackground(), 20); 
     } 
     component.setForeground(foreground); 
     component.setBackground(background); 
     return component; 
    } 

    private class RolloverListener extends MouseInputAdapter { 

     public void mouseExited(MouseEvent e) { 
      rolloverRowIndex = -1; 
      repaint(); 
     } 

     public void mouseMoved(MouseEvent e) { 
      int row = rowAtPoint(e.getPoint()); 
      if (row != rolloverRowIndex) { 
       rolloverRowIndex = row; 
       repaint(); 
      } 
     } 
    } 

    @Override 
    public void initialize() { 
     setFillsViewportHeight(true); 
     setAutoResizeMode(AUTO_RESIZE_OFF); 
     TableColumnModel tableColumnModel = getColumnModel(); 
     for(ComponentConstant.ColumnName columnName : ComponentConstant.Column.MOVIE_SEARCH_RESULT_TABLE) { 
      int order = columnName.getOrder(); 
      TableColumn tableColumn = tableColumnModel.getColumn(order); 
      if(order == 0) { 
       continue; 
      } 

      tableColumn.setCellRenderer(RendererFactory.getMovieSearchResultTableCellRenderer()); 
     } 
     RolloverListener listener = new RolloverListener(); 
     addMouseMotionListener(listener); 
     addMouseListener(listener); 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() { 
     return getPreferredSize().getWidth() < getParent().getWidth(); 
    } 
} 

감사합니다.

+0

나는 너무 복잡하다고 생각합니다. prepareRenderer +1을 제외하십시오. JTable, TableModel이 어떻게 작동하는지 또 다른 질문에 대한 모든 것입니다. – mKorbel

3

나는 그다지 좋지 않다고 생각한다. L & F, JTable은 좋아 보인다. 그러나 다른 컴파운드 JComponents는 ...., 내가 시간 낭비하지 않았다는 것을 확신하지 못한다. AVING은 어쩌면 아주 간단한 방법이

질문에서 자신의 포럼이나 문서 또는 BugParades에 그것에 대해 설명 뭔가 아무것도하지만이 그 테스트하고 당신은 어떤 시간

1)에 가서 확인 할 수 있습니다 Insubstantial

2) 다운로드 코드 소스

3) IDE 모든 클래스를 가져 (2-15 분 PC 하드웨어)

4) 폴더 시험 검색 의존 Check.java가,

5 ) 그것을 실행하고, 당신이 public Component prepareRenderer(TableCellRenderer renderer, int row, int column) 다음

가 오버라이드 (override) 할 필요가 Look & Feel로, 그 요구하기 전에 모든 Custom Java Swing Look and Feels

enter image description here

+0

Insubstantial-insubstantial-insubstantial_7.0-21-gefb2aaf를 다운로드했지만 Check.java를 찾을 수 없습니다. : –

+0

eeeerggth :-) 나는 이걸 https://github.com/Insubstantial/insubstantial/tree/master/substance/src/test/java/test – mKorbel

+0

에서 볼 수있다. 나는 2 주 반 동안 나의 마음에 드는 것을 데리러 갔다. L & F (원래 불면증) – mKorbel