簡體   English   中英

如果表大小小於設置值,則Java將JDialog適配到JTable

[英]Java fit JDialog to JTable if table size is less than a set value

我有一個帶有兩個面板的JDialog:一個JTable和一個按鈕。 我想將JDialog設置為( maxHeight= 600 pixels ):

(1)如果表格高度小於maxLength它將完全顯示表格,沒有空格,但是所有行都適合。

(2)如果高度大於maxHeight ,則將高度限制為maxHeight並在側面顯示滾動條。

到目前為止,我已經完成了大多數JDialog的工作,但是我不知道如何控制JTable的高度。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TestGUI {

    public static void main(String[] args) {        
        int a=10;        

        Object[][] data = new Object[a][2];       //Fill table with some data 
        for (int i = 0; i < a; i++) {data[i][0]=i; data[i][1]=i*i; }        

        JDialog dialog = new JDialog();
        dialog.setLayout(new BorderLayout());

        String[] header = {"Number", "Square"};        
        DefaultTableModel model = new DefaultTableModel(data, header);
        JTable table = new JTable(model);

        table.setPreferredScrollableViewportSize(new Dimension(450, 600));        

        table.setFillsViewportHeight(true);
        JScrollPane js = new JScrollPane(table);
        js.setVisible(true);

        dialog.add(js, BorderLayout.CENTER);

        JButton okButton = new JButton(new AbstractAction("OK") {
            private static final long serialVersionUID = 1L;
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
            } 
        });
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(okButton);
        dialog.add(buttonPanel, BorderLayout.SOUTH);
        //dialog.setSize(new Dimension(300, 600));
        dialog.setMinimumSize(new Dimension(255, 175));
        dialog.setVisible(true);
    }
}

硬編碼像素大小幾乎從來都不是一個好主意。 其他用戶將不會使用與您相同的字體,即使那些用戶也可能使用不同的字體大小。 (A 12點的字體是一種字體其文本的行72分之12英寸高,因此,即使用戶具有相同的字體,用戶的顯示器的點距可能影響每個字符多少像素使用。)

而不是maxHeight,定義一個maxVisibleRows變量。 您的表應使用getRowHeight根據所需的行數來計算其大小:

int visibleRows = model.getRowCount();
visibleRows = Math.max(1, visibleRows);
visibleRows = Math.min(maxVisibleRows, visibleRows);

Dimension size = table.getPreferredScrollableViewportSize();
size.height = table.getRowHeight() * visibleRows;
table.setPreferredScrollableViewportSize(size);

現在,您的JTable及其封閉的JScrollPane將具有與我認為要查找的一致的首選大小,這意味着您可以(並且應該)使用pack()。

dialog.pack();
dialog.setResizable(false);

如果表中可能有很多行,則應考慮避免對JDialog的大小進行任何限制。 如果有數百行,用戶將不會欣賞被迫一次只查看八行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM