jTable mit automatischer Zeilenhöhe je nach Fenstergröße.

Greyhole

Neues Mitglied
Hi.
Ich habe ein kleines Problem und hoffe ihr könnt mir da weiterhelfen.
Wie der Titel schon sagt hätte ich gerne das sich die Zeilenhöhe der Zeilen einer jTable (DefaultModel usw...),
je nachdem ob ich die Größe des jFrames ändere, ebenfalls ändert.
Ich habe eine feste Anzahl an Zeilen (10), und immer wenn ich das Fenster Maximiere ändert sich zwar die Größe der jTable (was bei jTable.getSize().getHeight() aber keine veränderung bringt) aber die Höhe der Zeilen nicht weswegen der untere Tabellenbereich dann leer ist.

Nun soll sich meine Tabelle aber an die Bildschirmgröße anpassen sodass entweder die Zeilenhöhe, oder die Anzahl der Zeilen automatisch geändert werden muss.

Für beides finde ich momentan leider keine Lösung da ich leider keinen Indikator für die momentane Tabellengröße finde. Wie gesagt "jTable.getSize().getHeight()" liefert, egal ob Vollbild oder Fenster, immer den selben Wert...

Könnt ihr mir da weiter helfen?
Vielen lieben Dank 😉
 
Java:
public class XY extends JFrame{
    public XY(){
        setLayout(new FlowLayout());
        final JTable table = new JTable(10,2);
        add(table);
        addComponentListener(new ComponentAdapter(){
            @Override
            public void componentResized(ComponentEvent e) {
               JFrame frame = (JFrame)e.getComponent();
               int compWidth = frame.getContentPane().getSize().width;
               int compHeight = frame.getContentPane().getSize().height;
               table.setRowHeight((int)compHeight/10);
               table.setPreferredSize(new Dimension(compWidth,compHeight));
            }
        });
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setLocationByPlatform(true);
       pack();
       setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                 new XY();
            }
        });
    }
}
 
Ich habe zur Zeit genau das selbe Problem und die Lösung von Attila finde ich eigentlich sehr gut. Leider stimmt die Höhe nicht hundert prozentig und da ich keine Scrollbars habe, wird immer die letzte Zeile nur halb angezeigt. Habe daher den Code ein wenig modifiziert:

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class TestTable extends JFrame {

  private static final long serialVersionUID = 1L;
  
  private JPanel contentPane;
  private JTable table;
  
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          TestTable frame = new TestTable();
          frame.setVisible(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  public TestTable() {
    init();
  }
  
  private void init() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);
    
    table = new JTable();
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    table.setAutoscrolls(false);
    table.setModel(new DefaultTableModel(
      new Object[][] {
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
      },
      new String[] { "New column", "New column", 
                     "New column", "New column", 
                     "New column", "New column" }
    ));
    
    addComponentListener(new ComponentAdapter(){
      @Override
      public void componentResized(ComponentEvent e) {
         int compWidth = contentPane.getSize().width;
         int compHeight = contentPane.getSize().height;
         table.setRowHeight((int)compHeight/table.getRowCount() - 3);
         table.setPreferredSize(new Dimension(compWidth,compHeight));
      }
  });
    
    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    contentPane.add(scrollPane, BorderLayout.CENTER);
  }
}

Leider ist es immer noch nicht ganz sauber und für den Fall, dass mehr Zeilen hinzukommen, passt die Berechnung nicht mehr. Hast du diesbezüglich noch eine Idee?

Noch eine Frage: Was genau macht eigentlich [c]setFillsViewportHeight[/c]? Laut der API eigentlich genau das, was ich und der Threadstarter möchte oder? Es funktioniert nur nicht.
 

Zurück
Oben