2009-11-20 3 views
1

Jtable이 있는데 행에 테두리를 추가하여 행을 강조하고 싶습니다. 나는 DefaultTableCellRenderer을 확장했으며, 작업은 getTableCellRendererComponent 방법으로 수행되어야한다고 생각합니다.Jtable의 행에 어떻게 테두리를 추가합니까?

행의 개별 셀에 대한 사용자 지정 테두리를 만드는 데 필요한 행 개념이없는 것 같기 때문에 추측하고 있습니다. 첫 번째 셀의 왼쪽, 위쪽 및 아래쪽, 모든 내부 셀의 위쪽 및 아래쪽, 행의 마지막 셀의 위쪽, 아래쪽 및 오른쪽과 같은 것입니다. 실제로 생각 프로세스를 실행하는 방법을 찾는 데 문제가 있습니다. 나는 setBorder() 방법을 사용하는 방법을 모르거나 그것이 필요한 방향이라면.

답변

2

올바른 생각을 했으므로 표에있는 위치 (예 : 가장자리, 중심 등)에 따라 cellrenderer의 라벨에 테두리를 설정해야합니다.

matteborder을 살펴보십시오. 너비와 폭에 따라 테두리를 그릴 영역을 지정할 수 있습니다.

+0

일을하지만 난 –

+0

감사합니다, 올바른 방향으로 절 지적 :) 투표를 밖으로 해요 : 다음 코드는 선택된 셀과 행의 테두리를 만들 것입니다. 나중에 참조 할 수 있도록보다 완벽한 대답으로 내 질문을 편집하겠습니다. –

8

이 경우 사용자 지정 렌더러를 만들지 않습니다. 예, 모든 데이터가 동일한 유형 인 경우 작동합니다. 그러나 모든 렌더러를 사용하는 날짜 및 정수 및 부울 값과 함께 문자열을 혼합하기 시작하면 어떻게됩니까? 그런 다음 4 개의 사용자 정의 렌더러를 만들어야합니다.

더 나은 방법은 prepareRenderer (...) 메소드 JTable을 오버라이드하여 한 곳에서 코드를 추가 할 수 있도록하는 것입니다. 다음은 시작하기위한 예제입니다. 실제로는 위쪽/아래쪽에 MatteBorder가 포함 된 CompoundBorder를 사용하고 왼쪽/오른쪽에 EmptyBorder를 사용하면 Border의 단일 인스턴스를 만들 수 있습니다. 갈 수있는 가장 좋은 방법은 prepareRendere 메소드를 오버라이드 (override)하는 것입니다 camickr

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 
import javax.swing.text.*; 
import javax.swing.border.*; 

public class TablePrepareRenderer extends JFrame 
{ 
    JTable table; 

    public TablePrepareRenderer() 
    { 
     Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"}; 
     Object[][] data = 
     { 
      {"Buy", "IBM", new Double(1000), new Double(80.5), Boolean.TRUE}, 
      {"Sell", "MicroSoft", new Double(2000), new Double(6.25), Boolean.TRUE}, 
      {"RSell", "Apple", new Double(3000), new Double(7.35), Boolean.TRUE}, 
      {"Buy", "Nortel", new Double(4000), new Double(20), Boolean.TRUE} 
     }; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     table = new JTable(model) 
     { 
      // Returning the Class of each column will allow different 
      // renderers to be used based on Class 

      public Class getColumnClass(int column) 
      { 
       return getValueAt(0, column).getClass(); 
      } 

      public Component prepareRenderer(
       TableCellRenderer renderer, int row, int column) 
      { 
       Component c = super.prepareRenderer(renderer, row, column); 
       JComponent jc = (JComponent)c; 

       // Color row based on a cell value 
       // Alternate row color 

       if (!isRowSelected(row)) 
        c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY); 
       else 
        jc.setBorder(new MatteBorder(1, 0, 1, 0, Color.RED)); 


       // Use bold font on selected row 

       return c; 
      } 
     }; 

     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     table.changeSelection(0, 0, false, false); 
     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     TablePrepareRenderer frame = new TablePrepareRenderer(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

다른 요구 사항에서 이미 custom cellrenderer가 있었지만 다른 데이터 유형이 문제를 일으키지 않았습니다. –

+1

그건 중요하지 않습니다. 이 방법은 현재 사용중인 셀 렌더러를 신경 쓰지 않습니다. 이는 솔루션의 핵심입니다. 기본 렌더러 또는 사용자 정의 렌더러가 작동합니다. – camickr

+1

그런데 하나의 렌더러에 Date, Integer, String 및 Booleans를 렌더링하는 렌더러가 있다면, 이것은 끔찍한 디자인입니다. – camickr

0

나는>에 동의합니다.

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 

Component c = super.prepareRenderer(renderer, row, column);  
JComponent jc = (JComponent)c; 

if (isRowSelected(row)){ 
    int top = (row > 0 && isRowSelected(row-1))?1:2; 
    int left = column == 0?2:0; 
    int bottom = (row < getRowCount()-1 && isRowSelected(row + 1))?1:2; 
    int right = column == getColumnCount()-1?2:0; 

    jc.setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, this.getSelectionBackground())); 
} 
else 
    jc.setBorder(null); 

return c; 
} 
관련 문제