gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:40:08 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com