Swing jTable (bestimmte Zellen umrahmen)

GianaSisters

Bekanntes Mitglied
Hallo Zusammen,

ich habe einen jTable, der aus einer 4x4 Matrix besteht (horizontale und vertikale Linien werden angezeigt). Nun möchte ich, dass die oberen 2 Felder einen gemeinsamen Rahmen haben und auch die Trennlinie nicht mehr zu sehen ist.
Das Prinzip so ähnlich wie hier unter "Cell Border":
JTable Examples

Den Quellcode konnte ich mit meinem Amateurwissen nicht wirklich umschreiben bzw. Stundenlang versucht ohne Erfolg, außerdem möchte ich es ja auch nur relativ Simpel haben.
Hat Jemand eine Ahnung wie ich das realisieren können ? Am liebsten so ein ganz kleines Beispiel.
Vielen Dank schonmal,
Giana
 

Michael...

Top Contributor
Nun möchte ich, dass die oberen 2 Felder einen gemeinsamen Rahmen haben und auch die Trennlinie nicht mehr zu sehen ist.
Sollen die Zellen nur einen gemeinsamen Rahmen haben oder sollen sie zu einer Zelle zusammengefasst werden? Letzteres wird schwierig.
Ersteres könnte man eventuell mittels entsprechender CellRenderer realisieren oder man zeichnet selbst ein Rechteck um die Zellen (z.B. auf der Glasspane). Die senkrechten Gitterlinien müsste man dann deaktivieren.

Grundsätzlich werden die Zellen einer JTable mittels einem oder mehrerer TableCellRenderer dargestellt.
 

GianaSisters

Bekanntes Mitglied
Hallo Michael,

danke für die schnelle Antwort. Mir reicht es erstmal, dass die Felder einen gemeinsamen Rahmen haben (wie es auf der verlinkten Seite von meinem Ursprungspost zu sehen ist). Vom TableCellRenderer hab ich auch schon gehört, aber da ich mit Netbeans arbeite, war mir das bisher ein bißchen zu schwer, dass da einzupflegen - sollte aber für mich kein Problem darstellen. :)
Hast Du vielleicht ein kleines Beispiel wie man das macht ? Würde es denn für den Fall eine möglichkeit geben, wenn die Felder "zusammenwachsen" sollen, dort die Beschriftung über mehrere Zeilen hinweg machen zu können ?
lg
 
G

Gast2

Gast
Hallo Michael,

danke für die schnelle Antwort. Mir reicht es erstmal, dass die Felder einen gemeinsamen Rahmen haben (wie es auf der verlinkten Seite von meinem Ursprungspost zu sehen ist). Vom TableCellRenderer hab ich auch schon gehört, aber da ich mit Netbeans arbeite, war mir das bisher ein bißchen zu schwer, dass da einzupflegen - sollte aber für mich kein Problem darstellen. :)
Hast Du vielleicht ein kleines Beispiel wie man das macht ? Würde es denn für den Fall eine möglichkeit geben, wenn die Felder "zusammenwachsen" sollen, dort die Beschriftung über mehrere Zeilen hinweg machen zu können ?
lg

Wie schauen denn deine Versuche bis jetzt aus?
 

Michael...

Top Contributor
Hab gerade mal nachgeschaut. Auch wenn man das Gitter "deaktiviert" bleibt es erhalten. Es wird dann nur in der selben Farbe wie der Hintergrund gemalt. Man wird also auch mittels CellRenderer keinen wirklich durchgängig Rahmen hinbekommen.

Wenn man's sauber implementieren will muss man da wohl in das TableUI eingreifen.

Würde es denn für den Fall eine möglichkeit geben, wenn die Felder "zusammenwachsen" sollen, dort die Beschriftung über mehrere Zeilen hinweg machen zu können ?
Da muss man mit hoher Wahrscheinlichkeit in das TableUI eingreifen.
 

GianaSisters

Bekanntes Mitglied
Java:
    public Insets getThickness() {
      Insets insets = new Insets(0,0,0,0);
      insets.top    = 3;
      insets.left   = 3;
      insets.bottom = 3;
      insets.right  = 3;
      return insets;
    }

class MyData implements CellBorder {
    private Border border;
    private Object obj;

    public MyData(Object obj, Border border) {
      this.obj    = obj;
      this.border = border;
    }

    public void setObject(Object obj) {
      this.obj = obj;
    }
    public String toString() {
      return obj.toString();
    }

    // CellBorder
    public void setBorder(Border border) {
      this.border = border;
    }
    public Border getBorder() {
      return border;
    }


private void testBorder(){
    
      boolean isTop,isLeft,isBottom,isRight;
      int[] columns = jTable1.getSelectedColumns();
      int[] rows    = jTable1.getSelectedRows();
      Insets insets = getThickness();



      int rowMax    = rows.length;
      int columnMax = columns.length;
    
      for (int i=0;i<rowMax;i++) {
        int row = rows[i];
        isTop    = (i == 0       )? true: false;
        isBottom = (i == rowMax-1)? true: false;

         for (int j=0;j<columnMax;j++) {
              int column = columns[j];
              isLeft  = (j == 0          )? true: false;
              isRight = (j == columnMax-1)? true: false;
       
      // Geht alle Felder durch
      //  System.out.println(column);
      //  System.out.println(row);


	MyData myData = (MyData)jTable1.getValueAt(row, column);
	  if (myData == null) {
	    myData = new MyData("", new LinesBorder(color,0));
	  }
	  LinesBorder border = (LinesBorder)myData.getBorder();

	    Insets tmp = new Insets(0,0,0,0);
	    if (isTop)    tmp.top    = Math.max(tmp.top    ,insets.top);
	    if (isLeft)   tmp.left   = Math.max(tmp.left   ,insets.left);
	    if (isBottom) tmp.bottom = Math.max(tmp.bottom ,insets.bottom);
	    if (isRight)  tmp.right  = Math.max(tmp.right  ,insets.right);
	    border.append(tmp, true);

            myData.setBorder(border);

	  jTable1.setValueAt(myData, row, column);
	}
      }
      jTable1.clearSelection();
      jTable1.revalidate();
      jTable1.repaint();



     }

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fmea;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;


/**
 * @version 1.0 03/09/99
 */
public class LinesBorder extends AbstractBorder implements SwingConstants {
  protected int northThickness;
  protected int southThickness;
  protected int eastThickness;
  protected int westThickness;
  protected Color northColor;
  protected Color southColor;
  protected Color eastColor;
  protected Color westColor;

  public LinesBorder(Color color) {
    this(color, 1);
  }

  public LinesBorder(Color color, int thickness)  {
    setColor(color);
    setThickness(thickness);
  }

  public LinesBorder(Color color, Insets insets)  {
    setColor(color);
    setThickness(insets);
  }

  public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    Color oldColor = g.getColor();

    g.setColor(northColor);
    for (int i = 0; i < northThickness; i++)  {
      g.drawLine(x, y+i, x+width-1, y+i);
    }
    g.setColor(southColor);
    for (int i = 0; i < southThickness; i++)  {
      g.drawLine(x, y+height-i-1, x+width-1, y+height-i-1);
    }
    g.setColor(eastColor);
    for (int i = 0; i < westThickness; i++)  {
      g.drawLine(x+i, y, x+i, y+height-1);
    }
    g.setColor(westColor);
    for (int i = 0; i < eastThickness; i++)  {
      g.drawLine(x+width-i-1, y, x+width-i-1, y+height-1);
    }

    g.setColor(oldColor);
  }

  public Insets getBorderInsets(Component c)       {
    return new Insets(northThickness, westThickness, southThickness, eastThickness);
  }

  public Insets getBorderInsets(Component c, Insets insets) {
    return new Insets(northThickness, westThickness, southThickness, eastThickness);
  }


  public boolean isBorderOpaque() { return true; }

  public void setColor(Color c) {
    northColor = c;
    southColor = c;
    eastColor  = c;
    westColor  = c;
  }

  public void setColor(Color c, int direction) {
    switch (direction) {
      case NORTH: northColor = c; break;
      case SOUTH: southColor = c; break;
      case EAST:  eastColor  = c; break;
      case WEST:  westColor  = c; break;
      default:
    }
  }

  public void setThickness(int n) {
    northThickness = n;
    southThickness = n;
    eastThickness  = n;
    westThickness  = n;
  }

  public void setThickness(Insets insets) {
    northThickness = insets.top;
    southThickness = insets.bottom;
    eastThickness  = insets.right;
    westThickness  = insets.left;
  }

  public void setThickness(int n, int direction) {
    switch (direction) {
      case NORTH: northThickness = n; break;
      case SOUTH: southThickness = n; break;
      case EAST:  eastThickness  = n; break;
      case WEST:  westThickness  = n; break;
      default:
    }
  }

  public void append(LinesBorder b, boolean isReplace) {
    if (isReplace) {
      northThickness = b.northThickness;
      southThickness = b.southThickness;
      eastThickness  = b.eastThickness;
      westThickness  = b.westThickness;
    } else {
      northThickness = Math.max(northThickness ,b.northThickness);
      southThickness = Math.max(southThickness ,b.southThickness);
      eastThickness  = Math.max(eastThickness  ,b.eastThickness);
      westThickness  = Math.max(westThickness  ,b.westThickness);
    }
  }

  public void append(Insets insets, boolean isReplace) {
    if (isReplace) {
      northThickness = insets.top;
      southThickness = insets.bottom;
      eastThickness  = insets.right;
      westThickness  = insets.left;
    } else {
      northThickness = Math.max(northThickness ,insets.top);
      southThickness = Math.max(southThickness ,insets.bottom);
      eastThickness  = Math.max(eastThickness  ,insets.right);
      westThickness  = Math.max(westThickness  ,insets.left);
    }
  }


}

Ziemlich großer Code, in dem oberen Teil hab ich nur einen Codeausschnitt gemacht... Es ist halt von meinem ursprungsbeispiel irgendwie kopiert. Vielleicht kann ja trotzdem Jemand den Fehler finden.
Vielen dank für die Antworten !
 
Zuletzt bearbeitet:

GianaSisters

Bekanntes Mitglied
Ich habe jetzt die Möglichkeit über den "getTableCellRendererComponent" versucht. Allerdings klappt es selbst mit einfachen Mitteln nicht so wie es sollte. Hier aber erst einmal das Beispiel:

Java:
private void testBorder(){
        MyTableCellRenderer myt = new MyTableCellRenderer();
        System.out.println("cellrender setzten");
        jTable1.setDefaultRenderer(Object.class,myt);
     
        System.out.println("cellrenderer gesetzt");
    }

Naja, das erste was mich hier nun stört ist, dass sich erst etwas tut wenn man auf den Table klickt. Dabei ist die Methode in einem Button drinnen, so das ich eigentlich gehofft hatte, dass es beim Klick dann passiert... Naja hier nun die MyTableCellRenderer-Klasse

Java:
package fmea;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyTableCellRenderer implements TableCellRenderer {
     
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, int row,
                                                   int column) {

        double solution = row / 2.0;
      //  System.out.println("ich bin ne wurst: " + row + "  : " + column);
       
       
        table.setValueAt("ah", row, column);
            return null;
    

    }
}

Das tolle ist, das hier das "ah" in jedes Feld geschrieben wird. Allerdings versteckt ? (Wieso??). Kann ich das so nicht für meine Ursprungsfragestellung hinbekommen ? Ich würde mich nochmal um Hilfe freuen !
 

GianaSisters

Bekanntes Mitglied
Hier nochmal eine Frage, da ich ziemlich am Verzweifeln bin.
Ich möchte gerne den Rahmen um eine Zelle haben.
Hier rein geht das Ganze:
SQL:
public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, int row,
                                                   int column) {
Wenn die Spalte 1 ist hab ich Testweise mal gemacht, dass sich die Farbe der Spalte ändert:
SQL:
switch(column) {
            case 1:  this.m_txt.setBackground(Color.RED); break;
            default: this.m_txt.setBackground(new Color(232, 232, 232));
        }

Jetzt möchte ich gerne, dass der Rahmen um diese Spalte ist... Das ganze so implementiert:
SQL:
switch(column) {
            case 1:  this.m_txt.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.black)); break;
            default: this.m_txt.setBackground(new Color(232, 232, 232));
        }

Problem: Ab Spalte 1 wird überall die darauffolgenden Spalten überall ein Rahmen gemacht. Wieso klappts bei der Farbe und nicht beim Rahmen ????


------------------

Edit: Habs hinbekommen mit:
Java:
default:  this.m_txt.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, Color.black));
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Problem: Ab Spalte 1 wird überall die darauffolgenden Spalten überall ein Rahmen gemacht. Wieso klappts bei der Farbe und nicht beim Rahmen ????
Für das Rendern der Zellen wird eine Komponente benutzt. Wenn dieser vorher (für die Zellen in Spalte 1) ein Rahmen zugewiesen wurde, der für anderen Zellen nicht mehr genutzt werden soll, muss ein anderer Rahmen zugewiesen werden oder der alte einfach entfernt werden.

Du kannst Dir den Renderer wie einen variablen Stempel vorstellen, wird für eine Zelle eine bestimmte Ausprägung benötigt, muss der Stempel jedesmal passend eingestellt werden. Der Stempel wird nach dem "Stempeln" der Zelle nicht automatisch zurückgesetzt, hätte also bei der nächste Zelle noch die selbe Ausprägung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
L Again: In JTable bestimmte Zellen färben AWT, Swing, JavaFX & SWT 12
S JTable: Eingabe nur für bestimmte Var.Typen zulassen AWT, Swing, JavaFX & SWT 13
B JTable: Zeilen sortieren, aber bestimmte Zeilen fest lassen AWT, Swing, JavaFX & SWT 9
G Bei JTable eine bestimmte Zelle färben AWT, Swing, JavaFX & SWT 11
R nur bestimmte Daten in JTable anzeigen lassen? AWT, Swing, JavaFX & SWT 3
A JTable, bestimmte Zeilen blau hinterlegen AWT, Swing, JavaFX & SWT 3
V Bestimmte Spalten im JTable nicht anzeigen AWT, Swing, JavaFX & SWT 2
S Bestimmte Zellenselektion in einer JTable AWT, Swing, JavaFX & SWT 12
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben