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 点字体是一种文本行为 12⁄72 英寸高的字体,因此即使用户使用相同的字体,用户显示器的点距可能会影响每个字符使用的像素数。)
定义一个 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 的大小进行任何限制。如果有数百行,用户将不会喜欢被迫一次只查看八行。
我有一个带有两个面板的 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 点字体是一种文本行为 12⁄72 英寸高的字体,因此即使用户使用相同的字体,用户显示器的点距可能会影响每个字符使用的像素数。)
定义一个 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 的大小进行任何限制。如果有数百行,用户将不会喜欢被迫一次只查看八行。