2016-09-09 6 views
0

:これは約カスタム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のための単なるラッパーである...ここに空想何もノートでは)ですカスタムレンダラーで行っているデータ(値)や他のすべてのものを操作することはできません。たぶん私はこれにどのように接近するのかという基本的な理解の問題があります。私はどんなヒントにも感謝しています!

答えて

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

関連する問題