JTable einzelne Zelle färben

Emrullah

Mitglied
Hallo zusammen ich Bins wieder 😀

versuch schon den ganzen tag bei meinem JTable es so einzurichten das ich die einzelne Zelle färbt bei negativ rot bei positiv grün bei 0 gelb.

ich krieg es hin die ganze Tabelle zu färben aber auf die einzelne Zelle komm ich nicht hin

Java:
package Panels;


import java.awt.Font;
import java.sql.SQLException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import systeme.MySQLConnection1;

/**
 *
 * @author OEM
 */
public class DatenTabelle extends JFrame {

    public static JFrame frame;

    

    static JScrollPane scl_panl;

    static JTable tbl_daten;

    private static Object[][] rowData = {};

    private static Object[] columnNames2 = {"Ausgabe/Jahr", "Alter Stand", "neue Abos", "gekündigte Abos", "Aktuelle Abos", "AboZiel", "Differenz"};
    MySQLConnection1 mySQL;
    String addieren, div, alterstand;
    double Umsatz, Umsatzminus;
    DefaultTableModel model;
    int[] differenz;

    int alteAusgabe, altesJahr, summe;

    public DatenTabelle(int[] x, int[] Ausgabe, int Menge, String AboID, int[] y, int Ausgaben, int alteAbos_add, int[] y_add, int[] y_div, int[] abo_kostenlos, int[] Aboziel) throws SQLException {

        mySQL = new MySQLConnection1();

        model = new DefaultTableModel(rowData, columnNames2);
        
        setTitle("Datentabelle");
        setResizable(false);
        setSize(122 * columnNames2.length, 55 + 35 * x.length);
        if (55 + 35 * x.length >= 1000) {
            setSize(122 * columnNames2.length, 1000);

        }
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(JLabel.CENTER);

        System.out.println("Panels.DatenTabelle.<init>()" + x.length + "    " + Ausgabe.length);

        differenz = new int[x.length];
        
        for (int i = 0; i < x.length; i++) {
            if (x[i] < 89) {
                x[i] += 2000;

            } else {
                x[i] += 1900;
            }

            if (i == 0) {
                alterstand = String.valueOf(alteAbos_add);

            } else {
                alterstand = String.valueOf(y[i - 1]);
            }

            differenz[i]= y[i]-Aboziel[i];

            model.addRow(new Object[]{Ausgabe[i] + "/" + x[i] //Ausgabe/Jahr
                ,
                 alterstand //"Alter Stand"
                ,
                 y_add[i] //"neue Abos"
                ,
                 y_div[i] //"gekündigte Abos"
                ,
                 y[i] - 1 //"Aktuelle Abos"
                ,
                 Aboziel[i]
                ,
                 differenz[i]});              //"Umsatz"

        }

        scl_panl = new JScrollPane();
        tbl_daten = new JTable(model) {
            @Override
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };

        System.out.println(model + "    model");
        for (int i = 0; i < columnNames2.length; i++) {
            tbl_daten.setFont(new Font("Arial", 0, 15));
            tbl_daten.setRowHeight(30);
            tbl_daten.getColumnModel().getColumn(i).setCellRenderer(rightRenderer);
        }

        scl_panl.setViewportView(tbl_daten);
        add(scl_panl);

    }

}



Tabelle sieht so aus und die Letzt spalte (DIFFERENZ) soll die Farbe sich dementsprechend anpassen

1641388529329.png
 
Du solltest dein Programm dringend überarbeiten und übersichtlicher einteilen. Zuallererst solltest du dich an den Styleguide halten: https://google.github.io/styleguide/javaguide.html
Die Variablen mySQL und frame werden bspw. nie verwendet und System.out.println gehört nicht in ein Programm mit grafischer Oberfläche, verwende stattdessen einen Logger: https://javabeginners.de/Allgemeines/Logging/Einfaches_Logging.php.
Arrays machen alles unnötig unübersichtlich, verwende für deine Daten besser richtige Domain-Objekte, welche auch die richtigen Datentypen abbilden können.
Ein Konstruktor soll auch nicht die komplette Logik des Programms abbilden. Die Verwendung der statischen Variablen solltest du dringend überdenken.
 
Ein bischen spät für eine Antwort, aber ich habe mich jetzt selber einen ganzen Tag durch dieses vertrackte Thema gekämpft, in der Zeit hätte ich auch einen kompletten Renderer für die Tabelle bauen können, aber das erschien mir ein bischen viel nur um einzelne Zellen in einer eher unwichtigen Tabelle anhand ihres Inhalts zu färben. Leider habe ich (in Java/Swing) auch keine einfachere Lösung gefunden, deshalb habe ich mir im Endeffekt so beholfen:

Java:
model.addRow(new Object[]{
                    Integer.toString(alUnterprojekte.get(i).getID()),
                    alUnterprojekte.get(i).getBenennung(),
                    "<html><body style='background-color: "+sBackground+"'><table width=60px><tr><td>"+
                        alUnterprojekte.get(i).getUnterabteilung().Kurzname()+
                    "<td><tr></table></body></html>",
                    alUnterprojekte.get(i).getVirtualWork(),
                    alUnterprojekte.get(i).getZeile()=);

Dabei muß man sich im klaren sein, daß man dort jetzt den html-text bekommt, wenn man den Inhalt der Zelle ausliest.
Ein Bearbeiten des Inhalts ist damit auch nicht ohne weiteres Sinnvoll machbar.
Wenn das nicht stört, ist das eine vielleicht etwas Hemdsärmelige aber funktionierende Lösung, zumindest für Tabellen, die hauptsächlich der Information dienen.
 
Zuletzt bearbeitet:

Zurück
Oben