:これは約カスタム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)メソッドは何とか私の目標を達成しません。テーブルで
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;
}
}
私はprepareRendererでいくつかのものを試してみましたが、ここでI:ここで
は応じJTabel(BASETABLEは私が必要とするいくつかのグッズでJTableのための単なるラッパーである...ここに空想何もノートでは)ですカスタムレンダラーで行っているデータ(値)や他のすべてのものを操作することはできません。たぶん私はこれにどのように接近するのかという基本的な理解の問題があります。私はどんなヒントにも感謝しています!
を追加する:このテーブルセルにカスタムレンダラが設定されていて、期待どおりに動作します。 – m0rb