2016-09-09 1 views
0

이 짧은 넣어 :Custom TableCellRenderer 대 prepareRenderer 또는 행 강조 표시 문제를 해결하는 방법은 무엇입니까?

이 약

내가 SAP 시스템에서 가져온 데이터를 표시하는 모델과의 JTable가 무엇입니까. 내 목표는 모델에있는 일부 데이터 만 표시하는 특정 열에 있습니다. 예를 들어 모델의 행에는 Object [ "a", "b"]가 있지만 사용자는 만 볼 수 있습니다.

그래서 StackOverflow와 커스텀 tablecellrenderers와 에디터 등을 사용하는 방법에 관한 많은 튜토리얼을 읽었지 만, 문제를 해결할 수는 없습니다. 렌더러를 등록한 셀 선택한 경우 강조 표시되지 않습니다. 가능한 해결책은 HERE이지만이 방법은 저에게 적합하지 않습니다.

여기 내 사용자 지정 렌더러입니다 :

public class SapChangeNumberCellRenderer extends DefaultTableCellRenderer{ 

private static final long serialVersionUID = -2649719064483586819L; 

private SapChangeNumberTable table; 
private int valuesSize; 

public final static String ASM_AMOUNT = LanguageServer.getString("71", "Baugruppen"); 

public SapChangeNumberCellRenderer(SapChangeNumberTable table) { 
    super(); 
    this.table = table; 
} 


@Override 
public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, 
     final boolean hasFocus, 
     final int row, final int column) { 

    // components & Layout 
    JPanel panel = new JPanel(new BorderLayout()); 
    JButton buttonDots = new JButton("..."); 
    JLabel text = new JLabel(); 

    List<String> values = (List<String>) value; 
    valuesSize = values.size(); 
    if (valuesSize > 0) { 
     // set values 
     buttonDots.setPreferredSize(new Dimension(14, 14)); 
     text.setText(values.get(0)); 
    } else { 
     text.setText(""); 
    } 

    if (valuesSize > 1) { 
     // button to open dialog only if we have more than 1 item 
     panel.add(buttonDots, BorderLayout.EAST); 
    } 

    panel.add(text, BorderLayout.WEST); 
    panel.setOpaque(true); 
    return panel; 
} 

@Override 
public String getToolTipText(MouseEvent e) { 
    String toolTip = String.valueOf(valuesSize) + Initializer.SPACE + ASM_AMOUNT; 

    return toolTip; 
} 

public SapChangeNumberTable getTable() { 
    return table; 
} 
} 

그래서 내가 다시 방법에서 주어집니다 구성 요소를 조작 값의 목록 크기에 따라 볼 수 있습니다. setOpaque (true) 메서드는 어떻게 든 내 목표를 달성하지 못합니다. 여기

는 따라 JTabel (참고 : BaseTable 그냥 내가 필요한 몇 가지 케이크와 JTable의 래퍼 ... 여기에 공상 아무것도이다)이다 나는 prepareRenderer에 몇 가지 물건을 시도 테이블에서

public class SapChangeNumberTable extends BaseTable { 

/** the model */ 
private SapChangeNumberTableModel model = new SapChangeNumberTableModel(); 

/** parent frame */ 
private SapPanel parent = null; 

public SapChangeNumberTable(SapPanel parent) { 
    this.parent = parent; 
    this.init(); 
} 

/** 
* init the table 
*/ 
private void init() { 

    // set model (not filled yet) 
    this.setModel(model); 

    // set renderer 
    setRendererAndEditor(); 

    // add search filter row, enabling sorting is included 
    this.addFilterSearchRowPanel(); 
    // single selection 
    this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
    // hide 
    this.hideColumns(); 
    this.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
} 

/** 
* sets the default table cell renderer 
*/ 
private void setRendererAndEditor() { 
    getColumnModel().getColumn(convertColumnIndexToView(SapChangeNumberTableModel.COL_ID_SPM_ASM_NUMBER)) 
      .setCellRenderer(new SapChangeNumberCellRenderer(this)); 
    getColumnModel().getColumn(convertColumnIndexToView(SapChangeNumberTableModel.COL_ID_SPM_ASM_NUMBER)) 
      .setCellEditor(new SapChangeNumberAsmRefTableCellEditor(this)); 
} 

@Override 
public void setStatusBarDataCount(boolean value) { 
} 

@Override 
public void hideColumns() { 
} 

@Override 
public int getColModelSortIndex() { 
    return 0; 
} 

@Override 
public void load() { 
} 

@Override 
public SapChangeNumberTableModel getModel() { 
    return model; 
} 

public boolean isChanging() { 
    return model.isFilling(); 
} 

public SapFactoryChange getRow(int row) { 
    return model.getSapFactoryChange(row); 
} 

@Override 
public void clear() { 
    model.clear(); 
} 

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { 
    Component comp = super.prepareRenderer(renderer, rowIndex, vColIndex); 

    if (vColIndex == SapChangeNumberTableModel.COL_ID_SPM_ASM_NUMBER) { 
     //what the hack to do here to manipulate the comp ? I can't add a JPanel to a plain Component 
    } 

    return comp; 
} 

} 

그러나 여기에서 I 데이터 (값) 및 사용자 지정 렌더러에서 수행중인 다른 모든 작업을 조작 할 수 없습니다. 어쩌면이 문제에 접근하는 방법에 대한 기본적인 이해 문제가있을 수 있습니다. 어떤 힌트에 감사드립니다!

답변

0

방금 ​​내가 원하는 동작을 덮어 쓸 것이라고 생각했던 매우 간단한 해결책을 찾았지만 그렇지 않습니다.

그냥 테이블에이 구현하십시오 샤름 같은

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { 
    Component comp = super.prepareRenderer(renderer, rowIndex, vColIndex); 

    if (isRowSelected(rowIndex)) { 
     comp.setBackground(Color.ORANGE); 
    } 

    return comp; 
} 

작품!

+0

추가 : 사용자 지정 렌더러가이 테이블 셀에 설정되어 있고 예상대로 작동합니다! – m0rb

관련 문제