2013-03-25 3 views
2

값 배열에서 채워지는 Jtable이 있습니다. 내 코드는 다음과 같다 :특정 열 값을 가진 JTable 전체 행의 색을 변경하는 방법

private static final String[] columnNames = {"Line Number", "Error","Fix Proposed","Percentage (%)"}; 
    static DefaultTableModel model = new DefaultTableModel(null,columnNames); 

    public static void DisplayMyJList(List<CaptureErrors> x,String extension, 
     ArrayList<Integer> l,ArrayList<Integer> p, 
     ArrayList<String> e,ArrayList<String> s) throws IOException {//Method to Dynamic get values to be populated in Jtable. 

    String theExtension = extension; 
    if(FILE_EXTENSION.equals("java")) { 
     for(CaptureErrors ex: x) { 

      Vector row = new Vector(); 
      row.add(ex.getLinenumber()); 
      row.add(ex.getMyfounderror()); 
      row.add(ex.getMycorrection()); 
      row.add(ex.getMyPercentage()+"%"); 

      model.addRow(row); 

      //model.setRowColour(1, Color.YELLOW); 
     } 
    } 

table = new JTable(model); 
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
    table.setFillsViewportHeight(true); 
    table.setShowGrid(true); 
    table.setShowVerticalLines(true); 
    table.setGridColor(new Color(0,128,0)); 
    JTableHeader header = table.getTableHeader(); 
    table.setBackground(new Color(255,228,225)); 
    table.setEnabled(true); 
    header.setFont(new Font("Dialog", Font.CENTER_BASELINE, 12)); 
    header.setBackground(Color.black); 
    header.setForeground(Color.yellow); 
    JScrollPane pane4 = new JScrollPane(table); 

는 내가하는 JButton를 사용하여 값의 배열 JTable가 채울 수 있습니다. "%"열에이 열의 모든 값을 30보다 높게 설정하면 color.red 행이 강조 표시됩니다.

사용자 싶습니다 TableCellRendererComponent.이 작업을 Jbutton을 클릭하면 수행 할 수 있습니다.

는 실제 JTable는, 다음과 같습니다 : 그럼 취득하는 내용에 따라 enter image description here

는 처음 2 개 행이 빨간색으로 강조되어야한다. 어떤 도움을 주셔서 감사합니다.

+1

테이블은 모든 데이터를 문자열로 취급합니다. 적절한 클래스를 반환하기 위해서'getColumnClass()'메소드를 오버라이드해야한다. 그래서 각 컬럼이 올바르게 포맷 될 수있다. – camickr

답변

5

렌더 API의 문제점 중 하나는 복합 렌더러를 제공하기가 어렵다는 것입니다. 할 수있는 방법이 있지만 잘못 이해하지는 마세요. ... [끝장내어]

기본 아이디어는 시리즈를 설정하고 싶습니까? 필요한 조건 하에서 무엇을해야 하는지를 결정하는 데 필요한 로직을 포함하는 기본 렌더러로부터 확장되는 렌더러의 목록입니다.

public class FilterRenderer extends DefaultTableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     Double percent = (Double) table.getValueAt(row, 3); 
     // You'll need some way to supply the filter value, may via a centralised 
     // manager of some kind. 
     if (percent > 0.3 && !isSelected) { 
      setOpaque(true); 
      setBackground(Color.RED); 
     } else { 
      setOpaque(false); 
     } 
     return this; 
    } 
} 

public class OtherCellRenderer extends FilterRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     // Apply any special renderer requirements, like translating an object value to String 
     return this; 
    } 
} 

당신은 (당신이 예에서, 즉 4의) 각 열에 대한 사용자 정의 렌더러를 필요로하고 테이블 열

TableColumnModel model = table.getColumnModel(); 
model.getColumn(0).setCellRenderer(new LineNumberRenderer()); 
model.getColumn(1).setCellRenderer(new ErrorRenederer()); 
model.getColumn(2).setCellRenderer(new FixProposedRenderer()); 
model.getColumn(3).setCellRenderer(new Percentage()); 

에 각각 적용 또는 당신은 붙박이 지원이 SwingLabs을 JXTable 사용할 수 있습니다 행 형광펜의 경우

7

사용자 지정 렌더러를 만들지 않고 솔루션을 보려면 Table Row Rendering을 참조하십시오.

Table Format Renderers을 확인하여 백분율 열을 쉽게 포맷 할 수 있습니다.

+0

+1, * 테이블 행 렌더링 *은 매우 유용하고 훌륭한 기사가 될 수 있습니다. – tenorsax

4

사용자 정의 셀 렌더러를 만들 수 있습니다. 구현시 특정 행에 대한 백분율 값이 30보다 큰지 확인한 다음이 셀을 강조 표시합니다. 예를 들어

은 : 필요한 경우

class SomeRenderer extends DefaultTableCellRenderer { 
    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, 
      int column) { 

     Component c = super.getTableCellRendererComponent(table, 
       value, isSelected, hasFocus, row, column); 

     if (isHighlightingEnabled){ 
      Integer percentage = (Integer) table.getValueAt(row, 3); 
      if (percentage > 30) 
       c.setBackground(Color.RED); 
     } 
     return c; 
    } 
} 
당신이 가능하게 할 수있다

/액션에이 렌더링 논리를 해제합니다.

자세한 내용은 Using Custom Renderers을 참조하십시오.

관련 문제