Frage

Ich habe eine JTable mit 3 Spalten. Ich habe die TableCellRenderer für alle die 3 Spalten wie folgt festgelegt (vielleicht nicht sehr effektiv?).

 for (int i = 0; i < 3; i++) {
     myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
 }

Die getTableCellRendererComponent() gibt eine Komponente mit einem zufälligen Hintergrundfarbe für jede Zeile.
Wie könnte ich den Hintergrund auf eine andere zufällige Farbe ändern, während das Programm ausgeführt wird?

War es hilfreich?

Lösung

würde Eine Möglichkeit, die aktuelle Farbe innerhalb des Modells für jede Zeile gespeichert sein. Hier ist ein einfaches Modell, das auf drei Säulen und drei Reihen festgelegt ist:

static class MyTableModel extends DefaultTableModel {

    List<Color> rowColours = Arrays.asList(
        Color.RED,
        Color.GREEN,
        Color.CYAN
    );

    public void setRowColour(int row, Color c) {
        rowColours.set(row, c);
        fireTableRowsUpdated(row, row);
    }

    public Color getRowColour(int row) {
        return rowColours.get(row);
    }

    @Override
    public int getRowCount() {
        return 3;
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return String.format("%d %d", row, column);
    }
}

Beachten Sie, dass setRowColour ruft fireTableRowsUpdated; Dies führt dazu, dass nur die Zeile der Tabelle aktualisiert werden.

Der Renderer das Modell aus der Tabelle bekommen:

static class MyTableCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        MyTableModel model = (MyTableModel) table.getModel();
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(model.getRowColour(row));
        return c;
    }
}

eine Reihe von Farbe ändern so einfach sein würde, wie:

model.setRowColour(1, Color.YELLOW);

Andere Tipps

Resumee von Richard Fearn Antwort, jede zweite Zeile grau zu machen:

jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        return c;
    }
});

Die anderen hier gegebenen Antworten funktionieren gut, da Sie die gleichen Renderer in jeder Spalte.

Allerdings neige ich dazu, dass in der Regel zu glauben, wenn ein JTable verwenden finden Sie verschiedene Arten von Daten in jeder Spaltenbezeichnung haben und deshalb werden Sie nicht den gleichen Renderer für jede Spalte werden. In diesen Fällen können Sie die Tabellenzeile Rendering Ansatz hilfreich finden .

Dies ist im Grunde so einfach, wie die Tabelle neu zu streichen. Ich habe nicht einen Weg, um selektiv repaint gefunden nur eine Zeile / Spalte / Zelle jedoch.

In diesem Beispiel auf die Schaltfläche klicken, ändert sich die Hintergrundfarbe für eine Zeile und ruft dann neu streichen.

public class TableTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Color[] rowColors = new Color[] {
                randomColor(), randomColor(), randomColor()
        };
        final JTable table = new JTable(3, 3);
        table.setDefaultRenderer(Object.class, new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus,
                    int row, int column) {
                JPanel pane = new JPanel();
                pane.setBackground(rowColors[row]);
                return pane;
            }
        });
        frame.setLayout(new BorderLayout());

        JButton btn = new JButton("Change row2's color");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                rowColors[1] = randomColor();
                table.repaint();
            }
        });

        frame.add(table, BorderLayout.NORTH);
        frame.add(btn, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private static Color randomColor() {
        Random rnd = new Random();
        return new Color(rnd.nextInt(256),
                rnd.nextInt(256), rnd.nextInt(256));
    }
}

Der Aufruf von getTableCellRendererComponent(...) enthält den Wert der Zelle, für die ein Renderer gesucht wird.

Sie können diesen Wert verwenden, um eine Farbe zu berechnen. Wenn Sie auch eine Abstract verwenden, können Sie einen Wert eines beliebigen Typs zu Ihrem Renderer zur Verfügung stellen können.

Wenn Sie eine Farbe haben, können Sie auf die Komponente setBackground(), dass Sie wiederkommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top