【问题标题】:Java fit JDialog to JTable if table size is less than a set value如果表大小小于设定值,Java 将 JDialog 拟合到 JTable
【发布时间】:2016-11-26 10:10:51
【问题描述】:

我有一个带有两个面板的 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);
    }
}

【问题讨论】:

  • 我认为您在将组件添加到对话框后忘记调用dialog.pack();
  • @VGR Pack 无济于事,因为我想指定表的行为,而不是整个对话框。此外,我应该在哪里输入 maxHeight?

标签: java jtable dimensions


【解决方案1】:

硬编码像素大小几乎不是一个好主意。其他用户不会使用与您相同的字体,甚至那些使用的用户也可能使用不同的字体大小。 (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 的大小进行任何限制。如果有数百行,用户将不会喜欢一次只能查看八行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多