2017-02-26 1 views
0
There are three panels inside a JFrame. 

    1. Parent panel (Using GridBaglayout) 
     i. Table panel 1 containing JTable (Using normal Border layout) & JScrollPane 
     ii.Button panel 2 containing "Add Row" and "Delete Row" button. (Using flow layout) 

    Requirements: 

    1. Add row and delete row buttons should add and delete table rows respectively. 
    2. The panel 1 size should increase/decrease with addition and deletion of rows. For this I have used: table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

    3. Scroll bars should appear only when panel 1 + panel 2 fills up the parent panel 

ich nicht tun table.setPreferredScrollableViewportSize (table.getPreferredSize()), jedes Mal wenn eine neue Zeile anderes hinzugefügt werden halten kann, wird die Bildlaufleiste niemals nach unten Regel erscheinen:anzeigen jtable Scrollbar nur, wenn JPanel Größe ist voll

Vertical scroll bar appear only when the component size (in this context, table) becomes larger than the view port size. 

Benötigen Sie helfen, den Zustand zu finden, wenn table.setPreferredScrollableViewportSize (table.getPreferredSize()) zu stoppen tun, oder gibt es eine andere Art und Weise über die Anforderungen für.

package practice; 

    import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.FlowLayout; 
    import java.awt.GridBagConstraints; 
    import java.awt.GridBagLayout; 

    import javax.swing.BorderFactory; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTable; 
    import javax.swing.SwingUtilities; 
    import javax.swing.table.DefaultTableModel; 

    public class TableExample3 { 

     private DefaultTableModel tableModel; 

     public void createAndShowGui() { 
      JFrame frame = new JFrame("Table size test"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      JPanel panel = new JPanel(new GridBagLayout()); 

      JPanel tablepanel = new JPanel(new BorderLayout()); 
      JTable table = new JTable(4, 4); 
      table.setFillsViewportHeight(false); 
      tableModel = (DefaultTableModel) table.getModel(); 
      JScrollPane pane = new JScrollPane(table); 
      tablepanel.add(pane); 

      GridBagConstraints gc = new GridBagConstraints(); 
      gc.fill = GridBagConstraints.HORIZONTAL; 
      gc.gridx = 0; 
      gc.gridy = 0; 
      gc.weightx = 1; 
      panel.add(tablepanel, gc); 

      JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      buttonPanel.setBorder(BorderFactory.createEtchedBorder()); 
      JButton addButton = new JButton("Add"); 
      JButton deleteButton = new JButton("Delete"); 
      buttonPanel.add(addButton); 
      buttonPanel.add(deleteButton); 

      table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

      Object[] data = null; 
      addButton.addActionListener((evt) -> { 

       tableModel.addRow(data); 

       // if (has to be some condition here when tablepanel + buttonPanel 
       // fills up the panel) { 

       table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

       panel.revalidate(); 
       panel.repaint(); 
      }); 

      deleteButton.addActionListener((evt) -> { 
       int rowCount = tableModel.getRowCount(); 
       tableModel.removeRow(rowCount - 1); 
       pane.getViewport().setPreferredSize(table.getPreferredSize()); 
       panel.revalidate(); 
       panel.repaint(); 

      }); 

      gc.gridy = 1; 
      gc.weighty = 1; 
      gc.anchor = GridBagConstraints.NORTH; 

      panel.add(buttonPanel, gc); 

      frame.getContentPane().add(panel); 
      frame.setVisible(true); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

     } 

     public static void main(String... args) { 
      TableExample3 example = new TableExample3(); 
      SwingUtilities.invokeLater(() -> example.createAndShowGui()); 
     } 
    } 

Antwort

2

Wenn Sie Ihr Ansichtsfenster eine angemessene Höhe (unabhängig von der ursprünglichen Anzahl der Zeilen) erhalten Sie Ihre Initialisierung ändern kann von

table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

um so etwas wie

Dimension preferredTableSize = table.getPreferredSize(); 
preferredTableSize.height = 100; 
table.setPreferredScrollableViewportSize(preferredTableSize); 

Aber am wichtigsten ist, in den Aktionshandlern für "Hinzufügen" und "Löschen" nichts wie setPreferredSize,tun, revalidate, repaint, weil es mehr schadet als nützt.

Dann wird die Bildlaufleiste angezeigt und verschwindet nach Bedarf.

+0

Die Schaltfläche zum Hinzufügen/Löschen sollte sich direkt hinter der letzten Zeile der Tabelle befinden. Wenn ich das tue, – user2596386

+0

Die Schaltfläche Hinzufügen/Löschen sollte direkt nach der letzten Zeile der Tabelle sein. Wenn ich die Portgröße für die Tabellenansicht wie angegeben einstelle, erscheinen diese Schaltflächen ziemlich weit hinter der letzten Zeile. Sobald eine neue Zeile hinzugefügt wird, sollte das Tabellenfeld in der Größe wachsen, um diese Zeile aufzunehmen, bis das gesamte Bildfeld voll ist (d. H. Indem die Größe des Tabellenfelds erhöht und die Größe des unteren Rasterfelds, das das Schaltflächenfeld enthält, verringert wird). Wenn jetzt die nächste Zeile hinzugefügt wird, sollte eine Bildlaufleiste angezeigt werden, da kein Leerzeichen vorhanden ist. – user2596386

+0

@ user2596386 Dann ist es wahrscheinlich besser, die erste Hälfte meiner Antwort zu ignorieren –

Verwandte Themen