Dreiecke in bestimmte Zellen einer JTable

Shelfelf

Mitglied
Hi,

ich würde gerne schwarze Dreiecke in bestimmte Zellen meiner Tabelle zeichnen. Leider fehlt mir hier völlig der Ansatz... Gibt es eine Möglichkeit ein Dreieck(◥ ◤ ◣ ◢) in eine Zelle einzufügen, sodass die Zelle im Prinzip diagonal geteilt wird, wobei eine Seite schwarz und eine weiß erscheint?

Gruß Shelfelf
 
Den Cell Renderer verwende ich bereits um beispielsweise Zellen schwarz einzufärben. Das Problem liegt bei den Dreiecken. Gibt es eine Methode, die Zellen diagonal zu teilen, oder nur die oben beschriebenen Dreiecke zu färben?
 
Nach langem Ausprobieren mit der paint Methode bin ich leider nicht in der Lage ein Dreieck zu zeichnen... Könnte mir bitte jemand auf die Sprünge helfen? Bin leider nicht so fit in Java. Hier ist mein Renderer bisher:
Java:
myTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
       [USER=48687]@Override[/USER]
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
           boolean hasFocus, int row, int column) {
        
         Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

         if ((myTable.getValueAt(row, column)) <= 5) {
           c.setBackground(Color.BLACK);
         } else if (myTable.getValueAt(row, column) == 6) {
           c.setBackground(Color.WHITE);
         }
         return c;
       }
     });
 
Du musst die Methode paint überschreiben!!
Code:
import java.awt.Graphics;
import javax.swing.table.DefaultTableCellRenderer;

public class MyCellRenderer extends DefaultTableCellRenderer {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        // zeichne dreieck oder mach sonst etwas
    }
}
😉
 
0k, ich habe jetzt versucht die paint Methode zu überschreiben. Ein paar Dinge sind mit allerdings noch nicht klar:
Wie beziehe ich die paint-Methode auf das Feld in der Tabelle, in das das Dreieck gezeichnet werden soll (c.getGraphics() gibt anscheinend null zurück (siehe code-Beispiel))
Welche Koordinaten muss ich wählen, damit ◤ entsteht?
Java:
package test;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTable;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;

public class Test {

   private JFrame frame;
   private JScrollPane scrollPane;
   private JTable table;

   /**
    * Launch the application.
    */
   public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
       public void run() {
         try {
           Test window = new Test();
           window.frame.setVisible(true);
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     });
   }

   /**
    * Create the application.
    */
   public Test() {
     initialize();
   }

   /**
    * Initialize the contents of the frame.
    */
   private void initialize() {
     frame = new JFrame();
     frame.setBounds(100, 100, 450, 300);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     scrollPane = new JScrollPane();
     frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
    
     int [][]matrix = {
         {0,1,2,3,0},
         {0,1,2,3,0},
         {0,1,2,3,0},
         {0,1,2,3,0},
         {0,1,2,3,0}
     };
     MyTableModel model = new MyTableModel();
     model.setMatrix(matrix);
     table = new JTable(model);
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     table.setRowHeight(50);
     for (int i = 0; i < 5; i++) {
       table.getColumnModel().getColumn(i).setPreferredWidth(50);
     }
     MyCellRenderer renderer = new MyCellRenderer();
     table.setDefaultRenderer(Object.class, renderer);
     scrollPane.setViewportView(table);
   }
}
Java:
package test;

import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel{
   int[][]matrix= new int[5][5];
   
   public void setMatrix(int[][]matrix){
     this.matrix=matrix;
   }
   @Override
   public int getRowCount() {
     return 5;
   }

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

   @Override
   public Object getValueAt(int rowIndex, int columnIndex) {
     return matrix[rowIndex][columnIndex];
   }
}
Java:
package test;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Polygon;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyCellRenderer extends DefaultTableCellRenderer{
   private int dreieck;
   private int[] xPoints0 = { 0, 0, 50 };
   private int[] yPoints0 = { 0, 50, 50 };
   private int[] xPoints1 = { 50, 0, 50 };
   private int[] yPoints1 = { 0, 50, 50 };
   private int[] xPoints2 = { 0, 0, 50 };
   private int[] yPoints2 = { 50, 0, 0 };
   private int[] xPoints3 = { 0, 50, 50 };
   private int[] yPoints3 = { 0, 0, 50 };
   private Polygon p0 = new Polygon(xPoints0, yPoints0, 3);
   private Polygon p1 = new Polygon(xPoints1, yPoints1, 3);
   private Polygon p2 = new Polygon(xPoints2, yPoints2, 3);
   private Polygon p3 = new Polygon(xPoints3, yPoints3, 3);
   
   @Override
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
       int row, int column) {

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

     if ((int)(table.getValueAt(row, column))== 0) {
       dreieck=0;
       this.paint(c.getGraphics());
     } else if ((int)(table.getValueAt(row, column))== 1) {
       dreieck=1;
       this.paint(c.getGraphics());
     }else if ((int)(table.getValueAt(row, column))== 2) {
       dreieck=2;
       this.paint(c.getGraphics());
     } else if ((int)(table.getValueAt(row, column))== 3) {
       dreieck=3;
       this.paint(c.getGraphics());
     }
     return c;
   }

   @Override
   public void paint(Graphics g) {
     super.paint(g);

     if (dreieck == 0) {
       g.drawPolygon(p0);
     } else if (dreieck == 1) {
       g.drawPolygon(p1);
     } else if (dreieck == 2) {
       g.drawPolygon(p2);
     } else if (dreieck == 3) {
       g.drawPolygon(p3);
     }
   }
}
 
Anstelle von "public void paint()" sollte eher die "protected void paintComponent(Graphics g)" überschrieben werden. Weiss nicht mehr genau warum. Aber dein eigentliches Problem ist: Du ruft die paint() Methode selber auf. Das macht man in der Regel nicht. Ich weiss auch gar nicht, ob es überhaupt Situationen gibt, in denen es Sinn macht sie selbst aufzurufen... Vielleicht weiss hier jemand mehr.

Lass die Zeilen: this.paint(c.getGraphics()); weg und du wirst die Dreiecke sehen.
 

Zurück
Oben