gpt4 book ai didi

java - Swing 应用程序中的 JTable 设计指南

转载 作者:行者123 更新时间:2023-11-30 04:41:03 29 4
gpt4 key购买 nike

我的 swing 应用程序中有一个非常困难的设计问题。一般来说,我有一个 JTable 和一个 JLabel 来显示。标签位于表格正下方。

  • 当这两个组件的高度不超过阈值时,表格和标签将正常显示。那么这两个组件的高度就会随着表中填充的记录数的增加而增加。
  • 当这两个组件的高度超过阈值时,我希望表格中有一个滚动条,并且这两个组件的高度将是阈值。

这个设计可能吗?

最佳答案

当首选大小更改时,Swing 布局不会自动重新布局,您必须调用重新验证(最好使用 TableModelListener 检查行数是否已更改)。您还需要一种根据组件的首选大小调整组件大小的布局,BorderLayout 会为边框中的组件执行此操作(但不会为中心的组件执行此操作)。对于不同的管理器,您需要 GridBag 或更好的 Mig-/Form-或表格(第三方)布局

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTableLayout {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(400, 400));

final DefaultTableModel model = new DefaultTableModel(0, 1);
JTable table = new JTable(model) {
@Override
public Dimension getPreferredScrollableViewportSize() {
// view port size should be the same as the preferred size
// limited to the height threshold
Dimension size = super.getPreferredSize();
size.height = Math.min(size.height, 100);
return size;
}
};

new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.addRow(new Object[] { "Extra row!" });
// trigger a relayout of the panel
panel.revalidate();
panel.repaint();
}
}).start();

panel.add(new JScrollPane(table), BorderLayout.PAGE_START);

JLabel label = new JLabel("my label");
label.setVerticalAlignment(JLabel.TOP);
panel.add(label, BorderLayout.CENTER);

JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}

关于java - Swing 应用程序中的 JTable 设计指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12297009/

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