2017-02-24 144 views
0

我寫了一個簡單的程序來創建一個空的JTable。但是,當我顯示錶格時,表格下方會出現一個額外的空白區域。現在,我想刪除表格下方的空白區域。如何從JTable底部刪除多餘的空白空間?

JTable的計劃:

public class Table extends JFrame { 

Table() 
{ 
     int numColoumns=5; 
     int numRows=10 ; 
     String[] colHeadings = {"COLUMN1","COLUMN2","COLUMN3","COLUMN4","COLUMN5"}; 

     DefaultTableModel model = new DefaultTableModel(numRows, numColoumns) ; 
     model.setColumnIdentifiers(colHeadings); 

     JTable table = new JTable(model); 
     JTableHeader head = table.getTableHeader(); 

     Container c = getContentPane(); 
     c.setLayout(new BorderLayout()); 
     c.add("North", head); 
     c.add("Center",table); 
}  
public static void main(String[] args) throws NumberFormatException, IOException 
{ 
    Table t = new Table(); 
    t.setSize(500,400); 
    t.setVisible(true); 
    t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
}} 

該計劃給了我一個表,但是行並沒有完全填滿的窗口。它顯示了一個具有給定高度和寬度的窗口(以像素爲單位)和相應的行數。在創建的行之後,顯示一個額外的空間,因爲行未填充到窗口中。任何人都可以幫助我從窗戶上移除額外的空間。

對不起,我創建了一個輸出圖像,但上傳圖像時出現問題。

+0

'c.add(新JScrollPane的(表));',你可以擺脫其他兩個'c.add'線。 'JTable#setFillsViewportHeight'也可能有幫助 – MadProgrammer

+0

你的意思是[像這樣](http://stackoverflow.com/a/6175860/418556)? –

+0

不,我的意思是這樣的:看到在下面的鏈接表中的第二張圖片:[鏈接](http://stackoverflow.com/questions/18274975/setpreferredscrollableviewportsize-vs-setfillsviewportheight-in-jtable)我想要的是相同的格式爲我的表在輸出中 –

回答

3

如圖所示here,你可以重寫Scrollable方法getPreferredScrollableViewportSize()返回反映您最初的期望行數的值。每次添加一行時,封閉窗口「會導致此Window的大小適合其子組件的首選大小和佈局」。

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

/** 
* @see https://stackoverflow.com/a/37343900/230513 
* @see https://stackoverflow.com/a/37318673/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     class MyTableModel extends AbstractTableModel { 

      private int n = 8; 

      private void addRow() { 
       n++; 
       fireTableRowsInserted(n - 1, n - 1); 
      } 

      @Override 
      public int getRowCount() { 
       return n; 
      } 

      @Override 
      public int getColumnCount() { 
       return 4; 
      } 

      @Override 
      public Object getValueAt(int rowIndex, int colIndex) { 
       return "R" + rowIndex + ":C" + colIndex; 
      } 
     }; 
     MyTableModel model = new MyTableModel(); 
     JTable table = new JTable(model) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(super.getPreferredSize().width, 
        getRowHeight() * getRowCount()); 
      } 
     }; 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     f.add(new JScrollPane(table)); 
     f.add(new JButton(new AbstractAction("Add Row") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       model.addRow(); 
       f.pack(); 
      } 
     }), BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
} 
相關問題