4

jTable..iの特定の行に色を付けたいのですが、このコードを使用して列に色を付けました。

private class CustomCellRenderer extends DefaultTableCellRenderer {

/* (non-Javadoc)
 * @see    
javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
 */

    @Override
public Component  getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {

  Component rendererComp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column);

//Set foreground color
// rendererComp.setForeground(Color.red);
//Set background color
  rendererComp .setBackground(Color.pink);

 return rendererComp ;
 }

}

そして、私は上記のコードを使用して呼び出します、

 jTable1.getColumnModel().getColumn(3).setCellRenderer(new CustomCellRenderer());

しかし、jTableの行についても同じことをしたいのですが、行の場合はgetColumnModel()またはgetColumn()はありません。それでは、別の方法は何でしょうか。私はJavaSwingを使用してNetbeansでそれを行っています。

4

3 に答える 3

6

これは、列の色と行の色の両方を組み合わせる方法の例です。基本的に、TableCellRendererでテストを実行して、背景をある色にするか別の色にするかを確認します。

import java.awt.Color;
import java.awt.Component;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class TestTable {

    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setBackground(null);
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            setText(String.valueOf(value));
            boolean interestingRow = row % 5 == 2;
            boolean secondColumn = column == 1;
            if (interestingRow && secondColumn) {
                setBackground(Color.ORANGE);
            } else if (interestingRow) {
                setBackground(Color.YELLOW);
            } else if (secondColumn) {
                setBackground(Color.RED);
            }
            return this;
        }

    }

    private JFrame f;
    private JTable table;

    protected void initUI() {
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        Vector<String> columNames = new Vector<String>();
        columNames.add("Col 0");
        columNames.add("Col 1");
        columNames.add("Col 2");
        for (int i = 0; i < 20; i++) {
            Vector<Object> v = new Vector<Object>();
            v.add(i % 3 == 0 ? "Hello" : "World");
            v.add("Some data in row " + (i + 1));
            v.add("Some other data in row " + (i + 1));
            data.add(v);
        }
        table = new JTable(new DefaultTableModel(data, columNames));
        Enumeration<TableColumn> en = table.getColumnModel().getColumns();
        while (en.hasMoreElements()) {
            TableColumn tc = en.nextElement();
            tc.setCellRenderer(new MyTableCellRenderer());
        }
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.add(new JScrollPane(table));
        f.pack();
        f.setVisible(true);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }

}
于 2012-06-21T10:42:06.860 に答える
3

列クラスに関係なく、行全体を変更する場合は、ここで説明するように、オーバーライドprepareRenderer()を検討してください。ここではTableCellRenderer、とprepareRenderer()アプローチを対比しています

于 2012-06-21T16:40:29.057 に答える
0

これは非常に汚い扱い方のようです。コンテナ用のlayoutManagerを使用してgridLayoutを使用する場合は、はるかに優れたアイデアになります(JFrameである必要があると思います)。Uは、個々のコンポーネント(JPanels、Jbuttons、またはその他のJComponent)を追加し、paint()/ repaint()メソッドを使用してそれらの外観を処理できます。

編集

または、getTableCellRendererComponent(....)メソッドを変更して、ネストされたif-elseステートメントまたはint行、int列(引数として提供される)に応じたswitch-caseを使用してカスタム背景色を設定できます。

これははるかに簡単になります

于 2012-06-21T10:24:35.587 に答える