Java 如果 table 大小小于设定值,则将 JDialog 适配到 JTable

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

我有一个带有两个面板的 JDialog:一个 JTable 和一个按钮。我想设置 JDialog 以便 (maxHeight= 600 pixels):

(1) 如果 table 高度小于 maxLength 它显示 table 完全没有空白 space,但所有行都适合。

(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);
    }
}

硬编码像素大小几乎从来都不是一个好主意。其他用户不会使用与您相同的字体,即使使用相同字体的用户也可能使用不同的字体大小。 (12 点字体是一种文本行为 1272 英寸高的字体,因此即使用户使用相同的字体,用户显示器的点距可能会影响每个字符使用的像素数。)

定义一个 maxVisibleRows 变量,而不是 maxHeight。您的 table 应该使用 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);

如果您的 table 可能有很多行,您应该考虑避免对 JDialog 的大小进行任何限制。如果有数百行,用户将不会喜欢被迫一次只查看八行。