2017-05-19 24 views
0

にXMLからデータを置くとき、私は、Javaとの個人的なプロジェクトに取り組んでとEclipseの下でスイングしています動作しません。「prepareRendererは、」私は私のcustomJTable

私はセルをレンダリングするためのカスタムのJTableをしました。

public class CustomJTable extends JTable{ 

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

    // change background of rows if [row,13] is even 
    c.setBackground(getBackground()); 
    if((int)getModel().getValueAt(row, 13) %2 == 0) 
     c.setBackground(Color.YELLOW); 

    // change font, border e background of cells if a string field is equal to some predeterminated value 
    Font myFont = new Font(TOOL_TIP_TEXT_KEY, Font.ITALIC | Font.BOLD, 12); 
    c.setForeground(getForeground()); 

    if (getModel().getValueAt(row, column)=="VALUE"){ 
     ((JComponent) c).setBorder(new MatteBorder(1, 1, 1, 1, Color.RED)); //needs cast for using setBorder 
     c.setFont(myFont); 
     c.setForeground(Color.RED); 
     c.setBackground(new Color(255, 230, 230)); 
    } 

    //set disabled cells appearance 
    if (getModel().getValueAt(row, column)=="DISABLED"){ 
     ((JComponent) c).setBorder(new MatteBorder(1, 1, 1, 1, Color.GRAY)); 
     c.setForeground(Color.LIGHT_GRAY); 
     c.setBackground(Color.LIGHT_GRAY); 
    } 

    return c; 
} 

私CustomJTableはオーバーライドメソッドを持つクラスのベクトルを含むカスタムのTableModel(AbstractTableModelにを拡張)からの値をとります。

私はこのmyModel.getVector().add(element)ようなもので、ベクターに要素を追加した場合、私は何の問題もありません。 myTable.updateUI()と入力すると、Rowが自動的にCustomJtableに追加され、正しく表示されます。すべてが完璧です!!!私は私が前に保存された外部.XMLから行を追加しようとする

問題がoccure。 JTableに追加したデータは正しく、黄色の行の背景も変更されていますが、セルはレンダリングされません(セルの境界ではなく、フォントの変更ではなくREDセルの背景)。

私はすべてを試しました。 validate()repaint()fireTableCellChanged() ... エラーが見つかりません。誰でも助けてくれますか?

答えて

2

getModel().getValueAt(row, column)=="VALUE" >>それは、すでにおそらくエラー以上です。文字列を比較する場合は、文字列を比較するにはObject.equalsを使用する必要があります。このように:"VALUE".equals(getModel().getValueAt(row, column).toString())文字列"DISABLED"と比べると、同じミスをもう少し深くする必要があります。

第二の間違いは、あなたがモデルでインデックスにビュー索引を使用していることです。 JTable.prepareRendererメソッドで渡されたrowcolumnのパラメータはビューインデックスです。 getModel().getValueAt(row, column)で行っているようにモデルをインデックスに使用することはできません。 getModel().getValueAt()を呼び出す前に、JTable.convertRowIndexToModelJTable.convertColumnIndexToModelを使用してこれらのインデックスを変換する必要があります。この詳細については、JTable documentationの入門説明を参照してください。

代わりにJTable.getValueAt()を使用してください。ここでは、JTable.prepareRendererに渡されたビューインデックスを使用できます。

+0

OMG、ありがとう。 私は長年Javaに戻ってきましたが、ビューインデックスとモデルインデックスの違いはありませんでした。それが問題でした! –