이 짧은 넣어 :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 데이터 (값) 및 사용자 지정 렌더러에서 수행중인 다른 모든 작업을 조작 할 수 없습니다. 어쩌면이 문제에 접근하는 방법에 대한 기본적인 이해 문제가있을 수 있습니다. 어떤 힌트에 감사드립니다!
추가 : 사용자 지정 렌더러가이 테이블 셀에 설정되어 있고 예상대로 작동합니다! – m0rb