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

标签 java jtable dimensions

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

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

最佳答案

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

定义一个 maxVisibleRows 变量,而不是 maxHeight。您的表应使用 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 大小的任何限制。如果有数百行,用户将不会喜欢被迫一次只查看八行。

关于如果表大小小于设定值,Java 将 JDialog 适配到 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38527577/

相关文章:

java - 导入另一个 spring 上下文时的 spring bean 名称

java - JTable 中的重音在 Eclipse 中显示,但在 .jar 中不显示

jQuery : add css class to menu item based on browser scroller position

java - String[] 的 Spring @Value 默认值

java - JScrollPane 自动向下滚动到 JPanel 中的最低组件

Java,使用 rs2xml 填充 jTable 时将 jTable 中的 boolean 列更改为复选框

java - 为 boolean 值设置 Jtable/Column Renderer

php - Google Search Console API 多个维度

ssas - 不能使引用关系起作用

java - 带有内容(信息)和按钮的弹出对话框