0

サンプルコードを提供することで、以前の問題を明確にしています

import java.awt.Color;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTable extends javax.swing.JFrame
{
private JButton jButton1;
private JScrollPane jScrollPane1;
private JTable jTable1;

public TestTable()
{
    initComponents();
}

private void initComponents(){

    ///////////////////////////////////////////////
    //Initializing components
    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    String data[][] = { {"A","B","C"},
                        {"R","S","T"},
                        {"U","V","W"}
                      };
    String col[] = {"X","Y","Z"};
    jTable1 = new JTable(new DefaultTableModel(data, col));
    jScrollPane1.setViewportView(jTable1);

    jButton1.setText("jButton1");

    ///////////////////////////////////////////////
    //positioning button and table
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap(15, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375,     javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap())
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addComponent(jButton1)
                    .addGap(160, 160, 160))))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 117,     javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(47, 47, 47)
            .addComponent(jButton1)
            .addContainerGap(102, Short.MAX_VALUE))
    );

    ///////////////////////////////////////////////
    //create event callback for the button
    jButton1.setText("Change data & color");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    ///////////////////////////////////////////////
    pack();
}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    //change the data in the table
    String data[][] = { {"a","b","c"},
                        {"r","s","t"},
                        {"u","v","w"}  };
    String col[] = {"x","y","z"};
    DefaultTableModel model= new DefaultTableModel(data,col);
    jTable1.setModel(model);

    //change the header in the table
    jTable1.getTableHeader().setBackground(Color.red);

    // IS IT POSSIBLE TO INSERT CODE HERE, WITHOUT REINITIALIZING jTable1,
    // SO THAT CLICKING THE BUTTON WILL TURN THE MIDDLE ROW GREEN?


    //change button text
    jButton1.setText("Changed");
}


public static void main(String[] args) 
{
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
            new TestTable().setVisible(true);
        }
    });

}

}

mainでTestTableを実行すると行の色を変更できましたが、(上記のように)コールバック内から行の色を変更する際に問題が発生します。私の推測では、次のようなコードを挿入することでした

jTable1.getCellRenderer(0, 0).getTableCellRendererComponent(jTable1, String.class, false,false,     0,0).setBackground(Color.green);

このコードでテーブルのエントリ(0,0)を指定しているので、このコードはエントリ(0,0)に変わると思いますが、これによりテーブル全体が緑色になります。モデルのデータとヘッダーの色は問題なく変更できます。

どんな助けでも心から感謝します。ありがとうクリス

4

4 に答える 4

4

これは、列の色と行の色の両方を組み合わせる方法の例です。基本的に、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-08-07T15:58:13.860 に答える
2
  • TableModelを更新し、新しいJTableを作成しないでください。その後、 Rendererもnewに追加する必要がありJTableます。

  • 更新はイベントディスパッチスレッドで行う必要があります。そうしないと、変更がGUIに表示されないか、Exceptionから取得します。RepaintManager

  • DefaultTableModelからへのすべての変更JTables viewは自動的に行われ、使用されるprepareRenderer場合はすべての行も再描画する必要があります。

于 2012-08-07T15:25:19.917 に答える
0

(@Ryanが言ったように)更新された質問でも、aを使用することTableCellRendererは依然としてあなたが望むものです。特別な色を付ける行を示すために、特別なコードを入力するだけです。次に例を示します(テストコードを使用)。

import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TestTable extends javax.swing.JFrame
{
    private JButton jButton1;
    private JScrollPane jScrollPane1;
    private JTable jTable1;
    private CustomRenderer renderer;

    public TestTable()
    {
        initComponents();
    }

    private void initComponents(){

        ///////////////////////////////////////////////
        //Initializing components
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        String data[][] = { {"A","B","C"},
                {"R","S","T"},
                {"U","V","W"}
        };
        String col[] = {"X","Y","Z"};
        jTable1 = new JTable(new DefaultTableModel(data, col));
        //Setup Renderer
        renderer = new CustomRenderer();
        //Add Renderer to table
        jTable1.getColumnModel().getColumn(0).setCellRenderer(renderer);
        jTable1.getColumnModel().getColumn(1).setCellRenderer(renderer);
        jTable1.getColumnModel().getColumn(2).setCellRenderer(renderer);

        jScrollPane1.setViewportView(jTable1);

        jButton1.setText("jButton1");

        ///////////////////////////////////////////////
        //positioning button and table
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addContainerGap(15, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375,     javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addContainerGap())
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                                .addComponent(jButton1)
                                                .addGap(160, 160, 160))))
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 117,     javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(47, 47, 47)
                        .addComponent(jButton1)
                        .addContainerGap(102, Short.MAX_VALUE))
        );

        ///////////////////////////////////////////////
        //create event callback for the button
        jButton1.setText("Change data & color");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        ///////////////////////////////////////////////
        pack();
    }


    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {



        DefaultTableModel model= (DefaultTableModel)jTable1.getModel();
        //change the data in the table
        String data[][] = { {"a","b","c"},
                {"r","s","t"},
                {"u","v","w"}  };
        String col[] = {"x","y","z"};
        model.setDataVector(data, col);

        // Necessary to re-add listener (because we're creating new columns) 
        jTable1.getColumnModel().getColumn(0).setCellRenderer(renderer);
        jTable1.getColumnModel().getColumn(1).setCellRenderer(renderer);
        jTable1.getColumnModel().getColumn(2).setCellRenderer(renderer);

        //change the header in the table
        jTable1.getTableHeader().setBackground(Color.red);


        // IS IT POSSIBLE TO INSERT CODE HERE, WITHOUT REINITIALIZING jTable1,
        // SO THAT CLICKING THE BUTTON WILL TURN THE MIDDLE ROW GREEN?
        renderer.colorModel.put(1, Color.green); //Yes

        //change button text
        jButton1.setText("Changed");
    }


    public static void main(String[] args) 
    {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestTable().setVisible(true);
            }
        });

    }

    //Custom Renderer - does the default rendering except if told the row should be a different color
    public static class CustomRenderer extends DefaultTableCellRenderer{

        //Stores what color you want for rows
        public HashMap<Integer, Color> colorModel = new HashMap<Integer, Color>();

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            //Default Rendering
            Component result = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            //Change color of background (If necessary)
            if(colorModel.get(row) != null){
                setBackground(colorModel.get(row));
            } else if(!isSelected){
                setBackground(null);
            }
            return result;
        }

    }
}
于 2012-08-08T14:54:36.847 に答える
0

ニックに感謝します。

メソッドをスキャンした後、必要な行を選択して色を付けることで、必要な行を強調表示する簡単な方法を見つけました。

    jTable1.setRowSelectionInterval(0, 1);
    jTable1.setSelectionBackground(Color.black);
于 2012-08-08T15:04:09.877 に答える