1

JTable検証に基づいてセルを強調表示しています。状況によっては、他の列の値を取得する必要があります。たとえば、column2USA がある場合は、column3数値のみにする必要があります。別の例として、col2が「USA」 col4数値の場合、col53 文字のみにする必要があります。誰かがこれを行う方法を提案できますか?

以下のフラグメントには、col3国名が含まれています。 col4col5依存しcol3ます。case 3とにいるときcase 4、 の値を確認できませんcase 2。たとえば、 のようにしif (col3.value == "USA")ます。

    [code]
    tcol = editorTable.getColumnModel().getColumn(0);
    tcol.setCellRenderer(new CustomTableCellRenderer());

    tcol = editorTable.getColumnModel().getColumn(1);
    tcol.setCellRenderer(new CustomTableCellRenderer());

    tcol = editorTable.getColumnModel().getColumn(2);
    tcol.setCellRenderer(new CustomTableCellRenderer());

    public class CustomTableCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent (JTable table, Object
        value,boolean isSelected, boolean hasFocus, int row, int col){

        Component cell = super.getTableCellRendererComponent(table, value,
        isSelected,hasFocus, row, col);

       if (value instanceof String) {
           String str = (String) value;

           switch (col) {
                case 0:
                    col1(str, cell);
                    break;
                case 1:
                    col2(str, cell);
                    break;
                case 2:
                    col3(str, cell);
                    break; 
           }
        }
        return cell;
     }

      private void col1(String str, Component cell) {       
            if(!str.matches("[0-9a-zA-z]")){
                cell.setBackground(Color.RED);
            } else {
                cell.setBackground(Color.GREEN); 
           }
     }

      private void col2(String str, Component cell) {       
         if(!str.matches("[A-Z]{3}")){
             cell.setBackground(Color.RED);
         } else {
              cell.setBackground(Color.GREEN); 
         }
     }
    [/code]
4

1 に答える 1

2

@kleopatra と @mKorbel は正しいです。フラグメントは不完全ですが、レンダラーでエディターとモデルの問題を解決しようとしているかのように見えます。

この例TableCellEditorに示すように、カスタムで入力した値を検証できます。この例に示すように、依存する列を で処理できます。TableModel

コメントで、「私が間違っていなければprepareRenderer()、すべての行をループする必要がありますよね?」と言っています。

いいえ、JTable「内部実装は常にこのメソッドを使用してレンダラーを準備し、このデフォルトの動作をサブクラスによって安全にオーバーライドできるようにします。」オーバーライドは、変更をすべてのレンダラーprepareRenderer()に選択的に適用する必要がある場合に最も役立ちます。

詳細については、概念: エディターとレンダラーを参照してください。

于 2012-02-18T16:04:52.530 に答える