2016-04-07 9 views
1

Ich habe ein JTable Objekt, das den gesamten Inhalt einer vorausgewählten MySQL-Tabelle zeigt. Wie Sie wissen, bietet diese Klasse Funktionen wie Spalten - automatische Größenanpassung: Ich möchte eine Prozedur erstellen, die die Summe der Breite aller in der Tabelle enthaltenen Zellen berechnet und den AUTO RESIZE-Modus einschaltet, wenn das Ergebnis geringfügig ist als sein preferredWidth. Ich habe versucht, Hunderte von Online-Führer zu folgen, aber mein Verfahren nicht funktioniert nach wie vor:Berechnen der breitesten Spalte einer JTable

public void setTableColumnPreferredWidth(javax.swing.JTable aTable) 
{ 
    int width = 0; 
    int TotalWidth = 0; 
    for (int row = 0; row < aTable.getRowCount(); row++) 
    { 
     for (int myColumn=0;myColumn < aTable.getColumnCount();myColumn++) 
     { 
      TableCellRenderer renderer = aTable.getCellRenderer(row, myColumn); 
      Component comp = aTable.prepareRenderer(renderer, row, myColumn); 
      width = Math.max (comp.getPreferredSize().width, width); 
      aTable.getColumnModel().getColumn(myColumn).setPreferredWidth(width); 
     } 
    } 

    for (int I=0;I<aTable.getColumnModel().getColumnCount();I++) 
     TotalWidth += aTable.getColumnModel().getColumn(I).getPreferredWidth(); 

    int maximum = 0; 

    if (MainTable.getAutoResizeMode() == MainTable.AUTO_RESIZE_ALL_COLUMNS) 
     maximum = MainTable.getPreferredSize().width; 
    else 
    { 
     int PreviousAutoresize = MainTable.getAutoResizeMode(); 
     MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_ALL_COLUMNS); 
     maximum = MainTable.getPreferredSize().width; 
     MainTable.setAutoResizeMode(PreviousAutoresize); 
    } 

    if (maximum < TotalWidth) 
     MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_ALL_COLUMNS); 
    else 
     MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_OFF); 
} 

Vielen Dank für Ihre Aufmerksamkeit.

+0

So wie es jetzt ist, wird der Code der Spalte Breite ändert bevor es die Breite des größten bestimmt, bin ich nicht sicher, ob das ist, was Sie tun möchten. – Titus

+0

Es wurde verwendet, um die Breite von Tabellenspalten zu ändern, ohne sie zu ändern. Beziehen Sie sich auf die automatische Größenanpassung? –

+0

Dies 'aTable.getColumnModel(). GetColumn (myColumn) .setPreferredWidth (width);' ändert die Breite der Spalte und davor haben Sie diese Breite = Math.max (comp.getPreferredSize(). Width, width); Ich denke, es wird verwendet, um die Breite der größten Spalte zu bestimmen. Wenn dies der Fall ist, müssen Sie zunächst die größte Breite ermitteln und erst danach die Breite aller Spalten auf diesen Wert ändern. – Titus

Antwort

1

ich möchte, ein Verfahren zu schaffen, die die Summe der Breite aller Zellen innerhalb des JTable und schaltet den Autoskal-Modus, wenn das Ergebnis geringfügig ist als sein preferredWidth

Die

enthielt berechnet Die Eigenschaft zur automatischen Größenänderung sollte auf dem verfügbaren Platz im Ansichtsfenster des Bildlaufbereichs basieren, der die Tabelle anzeigt.

Dies müsste dynamisch erfolgen, da sich die Größe des Bildlauffensters ändert.

Sie können der Bildlaufleiste eine ComponentListener hinzufügen und auf das Ereignis componentResized warten. Dann tun Sie Ihre Berechnung:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     setLayout(new BorderLayout()); 

     JTable table = new JTable(5, 5); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 

     scrollPane.addComponentListener(new ComponentAdapter() 
     { 
      @Override 
      public void componentResized(ComponentEvent e) 
      { 
       JScrollPane scrollPane = (JScrollPane)e.getComponent(); 
       JTable table = ((JTable)scrollPane.getViewport().getView()); 

       int tableWidth = table.getPreferredSize().width; 
       int viewportWidth = scrollPane.getViewport().getSize().width; 

       if (tableWidth < viewportWidth) 
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
       else 
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 

Oder eine andere Option ist ein wenig von der Standard-Layout-Verarbeitung der JTable außer Kraft zu setzen, wie in gezeigt: JTable resize only selected column when container size changes