Swing JTable, Header und Leerzeilen

Status
Nicht offen für weitere Antworten.

Drake

Bekanntes Mitglied
Hi

habe etwas Probleme mit einer JTable welche sich in einem GridBagLayout befindet

Java:
gamesTable = new JTable(cashTableTabelModel);
		gamesTable.setDefaultRenderer(Object.class, new TablesTableRenderer());
		gamesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		gamesTable.setFillsViewportHeight(true);
		gamesTable.setCursor(curHand);
		
		JTableHeader gamesTableHeader = gamesTable.getTableHeader();
		gamesTableHeader.setReorderingAllowed(false);
		gamesTableHeader.setResizingAllowed(false);
		gamesTableHeader.setCursor(curHand);
		
		JScrollPane scGamesTable = new JScrollPane(gamesTable);
		scGamesTable.setBorder(new javax.swing.border.EmptyBorder(0,0,0,0));
		   scGamesTable.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scGamesTable.setPreferredSize(new Dimension(468, 341));

screeny befindet sich im Anhang

Problem 1
Wie kreig ich den Header dazu, die letze column auch über dem Scrollbalken zu zeichnen?

Problem 2
gamesTable.setFillsViewportHeight(true); füllt die Tabelle mit ihrer Hintergrundfarbe auf.
Ich würde gerne das Muster der befüllten Zeilen durchgehend auf der vollen Größe haben.

mfg
Drake
 

Anhänge

  • JTable.jpg
    JTable.jpg
    15,9 KB · Aufrufe: 62

hiti

Mitglied
Hallo Drake,

Zu Problem 1
Garnicht: Die Lücke entsteht ja, da der Scrollbalken ja keine Spalte ist, und auch nicht zur letzten Spalte dazugehört. Wenn die Farbe stört, müsste die per background der Component anpassbar sein.

Problem 2
Meinst du, so wie es z.B. in Excell aussieht. Man hat immer gleich ein unendlich Lange Tabelle?
Ohne Daten zeigt die JTable auch keine Zeilen an. Du könntest also entsprechend leere Zeilen im Model hinzufügen.

Gruss, hiti
 

Ebenius

Top Contributor
Problem 1
Wie kreig ich den Header dazu, die letze column auch über dem Scrollbalken zu zeichnen?
Gar nicht. In der API-Doc zu JScrollPane siehst Du ein Bild, wie eine JScrollPane aufgebaut ist. Die Ecken sind jeweils eigene Komponenten. Das lässt sich auch nicht trivial ändern.

Je nach LookAndFeel kannst Du eine eigene Ecke setzen, die so aussieht wie ein TableHeader. So funktioniert es beispielsweise mit Metal und mit Nimbus. In GTK+ und in CDE/Motif sieht's nicht schön aus.
Java:
public static void main(String[] args) {
  final JTable table = new JTable(4, 4);
  final JScrollPane scrollPane =
        new JScrollPane(table,
              ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
              ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  if (scrollPane.getCorner(JScrollPane.UPPER_TRAILING_CORNER) == null) {
    final JTableHeader tableHeader = new JTableHeader() {

      @Override
      public Rectangle getHeaderRect(int column) {
        return getBounds();
      }
    };
    tableHeader.setTable(table);
    tableHeader.setReorderingAllowed(false);
    tableHeader.setResizingAllowed(false);

    final DefaultTableColumnModel cm = new DefaultTableColumnModel();
    final TableColumn col = new TableColumn(0);
    col.setIdentifier("");
    col.setHeaderValue("");
    col.setWidth(10000);
    cm.addColumn(col);

    tableHeader.setColumnModel(cm);

    /* Do not add the table header, as some TableHeaderUI-Implementations
       try to sort the table, even if the table header is disabled. That's
       why we just use a renderer pane to paint the table header. */
    final JComponent cornerComp = new JComponent() {

      final CellRendererPane pane;
      {
        pane = new CellRendererPane();
        add(pane);
      }

      @Override
      protected void paintComponent(Graphics g) {
        final Insets in = getInsets();
        pane.paintComponent(g, tableHeader, this, in.left, in.top,
              getWidth() - in.left - in.right, getHeight()
                    - in.top
                    - in.bottom, true);
        pane.removeAll();
      }
    };
    scrollPane.setCorner(JScrollPane.UPPER_TRAILING_CORNER, cornerComp);
  }

  /* create and show test frame */
  final JFrame f = new JFrame("Table Corner Test");
  f.setContentPane(scrollPane);
  f.pack();
  f.setLocationRelativeTo(null);
  f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  f.setVisible(true);
}

Problem 2
gamesTable.setFillsViewportHeight(true); füllt die Tabelle mit ihrer Hintergrundfarbe auf.
Ich würde gerne das Muster der befüllten Zeilen durchgehend auf der vollen Größe haben.
Die dargestellte Hintergrundfarbe der Zeilen wird vom CellRenderer gemacht. Wenn Deine CellRenderer damit kein Problem haben, kannst Du die JTable in etwa so erweitern:
Java:
public class JFillingTable extends JTable {

  final CellRendererPane trailingRowRenderer;
  {
    trailingRowRenderer = new CellRendererPane();
    add(trailingRowRenderer);
  }

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    final Rectangle visibleRect = getVisibleRect();
    final int columnCount = getColumnCount();
    final int rowCount = getRowCount();
    int row = rowCount;
    if (columnCount > 0) {
      final int stopY = visibleRect.y + visibleRect.height;
      Rectangle firstCellRect;
      while (true) {
        firstCellRect = getRowFillerRect(row, 0);
        if (firstCellRect.y < 0 || firstCellRect.y >= stopY) {
          break;
        }

        for (int column = 0; column < columnCount; column++) {
          final Rectangle cellRect =
                column == 0 ? firstCellRect : getRowFillerRect(row, column);
          final TableCellRenderer renderer = getCellRenderer(row, column);
          final Component c =
                renderer.getTableCellRendererComponent(this, null, false,
                      false, row, column);
          trailingRowRenderer.paintComponent(g, c, this, cellRect.x,
                cellRect.y, cellRect.width, cellRect.height, true);
          trailingRowRenderer.removeAll();
        }
        row++;
      }
    }
  }

  /**
   * Calculate the bounds (including the row / column margin) of the row
   * filler cell at the given row and column. Row is expected to be greater
   * than or equal to the {@link #getRowCount() row count}. Otherwise the
   * location of the rectangle will be {@code [-1, -1]}.
   * 
   * @param row the row index of the filler cell
   * @param column the column index of the filler cell
   * @return the filler cell rectangle
   */
  protected Rectangle getRowFillerRect(int row, int column) {
    final int rowCount = getRowCount();
    if (row < rowCount) {
      return new Rectangle(-1, -1, 0, 0);
    }

    final Rectangle r;
    final int rowHeight = getRowHeight();
    if (rowCount > 0) {
      /* there are rows above, use the last row's cell rectangle */
      r = getCellRect(rowCount - 1, column, true);
      r.y += r.height + (row - rowCount) * rowHeight;
      r.height = rowHeight;
    } else {
      /* there are no rows at all, calculate from scratch */
      r = new Rectangle(0, row * rowHeight, 0, getRowHeight());
      final boolean ltr = getComponentOrientation().isLeftToRight();
      if (column < 0) {
        r.x = column < 0 ^ ltr ? getWidth() : 0;
      } else {
        TableColumnModel cm = getColumnModel();
        if (ltr) {
          for (int i = 0; i < column; i++) {
            r.x += cm.getColumn(i).getWidth();
          }
        } else {
          for (int i = cm.getColumnCount() - 1; i > column; i--) {
            r.x += cm.getColumn(i).getWidth();
          }
        }
        r.width = cm.getColumn(column).getWidth();
      }
    }

    return r;
  }
}
Hab schon schöneren Quelltext geschrieben, aber es sollte funktionieren. Getestet gegen Nimbus, Metal, GTK+ und CDE/Motif.

Ebenius
 

Drake

Bekanntes Mitglied
Danke

@Ebenius
deine JFillingTable funktioniert wie gewünscht. :toll:

Was die obere rechte Ecke angeht, vlt. schaut die späterauch garnicht mehr so störend aus

mfg
Drake
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
L JTable Permanent Header AWT, Swing, JavaFX & SWT 0
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
V Swing JTable Row Header AWT, Swing, JavaFX & SWT 6
P Swing In JTable Header auch an der linken Seite AWT, Swing, JavaFX & SWT 2
V JTable Header L&F AWT, Swing, JavaFX & SWT 10
O Swing JTable Header AWT, Swing, JavaFX & SWT 2
Spin JTable Header wird nicht angezeigt ohne ScrollPane AWT, Swing, JavaFX & SWT 3
A JTable Header AWT, Swing, JavaFX & SWT 3
G Swing JTable Header neu initialisieren? AWT, Swing, JavaFX & SWT 2
G JTable Multiple Row Header Example - Probleme mit der Höhe der Zellen AWT, Swing, JavaFX & SWT 4
C Swing 1spaltige JTable ohne Header AWT, Swing, JavaFX & SWT 18
hdi Swing JTable: SortKeys und Header Column Width AWT, Swing, JavaFX & SWT 5
C jtable checkbox in header / spaltenüberschrift AWT, Swing, JavaFX & SWT 4
F Swing JTable Header modifizieren AWT, Swing, JavaFX & SWT 13
M Problem mit funktionellem JTable Header AWT, Swing, JavaFX & SWT 5
R JTable Header - will links kleines icon hinzufuegen..? AWT, Swing, JavaFX & SWT 6
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
C Swing JTable Header angelickt? AWT, Swing, JavaFX & SWT 4
eskimo328 JTable Zeilenumbruch im Header AWT, Swing, JavaFX & SWT 2
T 2JLabels in einen JTable Header AWT, Swing, JavaFX & SWT 2
A JTable Header + ScrollBar AWT, Swing, JavaFX & SWT 4
H JTable drucken mit Header AWT, Swing, JavaFX & SWT 4
G JTable und Header AWT, Swing, JavaFX & SWT 4
J JTable Zellen und Header AWT, Swing, JavaFX & SWT 2
D jTable Header zweizeilig? AWT, Swing, JavaFX & SWT 2
R JTable Mehrzeiliger Header zerstört JGoodies-Layout AWT, Swing, JavaFX & SWT 2
D JTable Header während Laufzeit ändern. AWT, Swing, JavaFX & SWT 3
D Jtable Header Höhe setzen ? AWT, Swing, JavaFX & SWT 2
D Header für den Row Header (JTable) AWT, Swing, JavaFX & SWT 2
O Probleme mit header von JTable AWT, Swing, JavaFX & SWT 6
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
D Mehrzeilige JTable Header AWT, Swing, JavaFX & SWT 2
N Jtable header fixieren AWT, Swing, JavaFX & SWT 2
K Kein Header in JTable ! AWT, Swing, JavaFX & SWT 8
F Die JTable und ihr Header AWT, Swing, JavaFX & SWT 5
J JTable - Header über mehrere Spalten AWT, Swing, JavaFX & SWT 3
G JTable sortieren durch click im Header AWT, Swing, JavaFX & SWT 9
J Border im Header bei JTable verändern AWT, Swing, JavaFX & SWT 3
S JTable Header AWT, Swing, JavaFX & SWT 5
K JTable - Header colspan AWT, Swing, JavaFX & SWT 7
K JTable header updated nicht immer AWT, Swing, JavaFX & SWT 5
A JTable - Header wird nicht angezeigt AWT, Swing, JavaFX & SWT 8
D JTable Header AWT, Swing, JavaFX & SWT 2
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
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

Ähnliche Java Themen


Oben