AWT jTable CellRenderer

noobee

Aktives Mitglied
moinmoin@ community,

ich versuche für unseren kleinen Verein ein Programm zu erstellen, um uns etwas Schreibarbeit abzunehmen. Ich möchte nun gern in der Tabelle einzelne Zellen färben. Der Plan ist, wenn etwas mit "2" endet, den Background blau zu färben. Endet der String mit "x" wird es orange.
Kann mir jemand sagen, ob es an meinem "TableCellRendererComponent" liegt oder wo steckt der Fehler?


Java:
package javaapplication8;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class NewClass extends JFrame {

    JTable table;

    DefaultTableModel model;

    JPanel buttonPanel;
   
    JButton button;
   
    JLabel label;

    public NewClass(JTable table, DefaultTableModel model, JPanel buttonPanel, JButton button) throws HeadlessException {
        this.table = table;
        this.model = model;
        this.buttonPanel = buttonPanel;
        this.button = button;
    }

    public NewClass() {
        setTitle("Monatliche Übersicht");
        setMinimumSize(new Dimension(1000, 900));
        setPreferredSize(new Dimension(1000, 900));
       
        int beginnMonat = 1;
        int beginnJahr = 17;     
       
        Object[][] data = {};
        String[] columnNames = {"Nr.",
                                "Firma",
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //01-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //02-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //03-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //04-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //05-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //06-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //07-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //08-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //09-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //10-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr),   //11-17
                                String.valueOf(beginnMonat++)+"/"+String.valueOf(beginnJahr++),   //12-17
                                };
        model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);
        for(int i = 0; i < 100; i++){
            model.addRow(createRow());
        }
        table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        // Add table and a Button panel to the frame
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);

        buttonPanel = new JPanel();
        JScrollPane sp = new JScrollPane(buttonPanel);
        sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        getContentPane().add(sp, BorderLayout.SOUTH);
       
        // ---------------------------------------------------
        button = new JButton("Add Column");
        buttonPanel.add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                table.setAutoCreateColumnsFromModel(false);
                String header = "Col" + (table.getColumnCount() + 1);
                model.addColumn(header);
                
                TableColumn column = new TableColumn(table.getColumnCount());
                column.setHeaderValue(header);
                table.addColumn(column);
                
                buttonPanel.getComponent(3).setEnabled(false);
                buttonPanel.getComponent(4).setEnabled(false);
                table.requestFocusInWindow();
            }
        });
        // ---------------------------------------------------
        button = new JButton("Remove Last Column");
        buttonPanel.add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int columns = model.getColumnCount();
                if (columns > 0) {

                    if (!table.getAutoCreateColumnsFromModel()) {
                        int view = table.convertColumnIndexToView(columns - 1);
                        TableColumn column = table.getColumnModel().getColumn(
                                view);
                        table.getColumnModel().removeColumn(column);
                    }

                    model.setColumnCount(columns - 1);
                }
                table.requestFocusInWindow();
            }
        });
       
        //////////////////////////////////////////////////////////////////////////////////////
        // setze Spaltenbreite aller Spalten
        //////////////////////////////////////////////////////////////////////////////////////
        table.getTableHeader().setReorderingAllowed(false);
        table.setAutoResizeMode(AUTO_RESIZE_OFF);
        table.getColumnModel().getColumn(0).setPreferredWidth(25);
        table.getColumnModel().getColumn(1).setPreferredWidth(150);
        for(int i= 2; i<table.getColumnCount(); i++){
            table.getColumnModel().getColumn(i).setPreferredWidth(40);
        }
       
        table.setDefaultRenderer(TableCellRendererComponent);
       
       
    }

    private Object[] createRow() {
        Object[] newRow = new Object[2];
        int row = table.getRowCount() + 1;
        //newRow[0] = Integer.toString(row);
        //newRow[1] = LETTERS.substring(row - 1, row);
        return newRow;
    }

    public static void main(String[] args) {
        monatlich frame = new monatlich();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
 
    public Component TableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {

        //Verändern aufgrund des Zelleninhalts
        if (value.toString().endsWith("2"))
            table.setForeground(Color.BLUE);
        else
            table.setForeground(Color.RED);
        if (value.toString().equals("x"))
            table.setBackground(Color.ORANGE);

        return this;
        }
   
}
 
Ah, ok. Hab ich korrigiert.
Java:
        // die Spalten, die gefärbt werden sollen
        for(int i = 0; i<table.getColumnCount(); i++){
            table.getColumnModel().getColumn(i).setCellRenderer(new MyRenderer());
        }

Mein "MyRender" sieht wie folgt aus:
Java:
class MyRenderer implements TableCellRenderer {
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    JTextField editor = new JTextField();
    if (value != null)
      editor.setText(value.toString());
   
    //editor.setBackground((row % 2 == 0) ? Color.white : Color.cyan);
    editor.setBackground(editor.getText().equals("x")) ? Color.white : Color.cyan);
    return editor;
  }
}
Warum geht die Abfrage
Java:
editor.getText() == "x"
nicht, jedoch
Java:
editor.getText().equals("x")
schon. Es steht in der Tat in den Zellen nur ein kleines x. Dann sollte doch auch editor.getText() == "x" gehen, oder?
 

Neue Themen


Zurück
Oben