调整 JDialog 和 JTable 列大小时出现问题

我正在创建一个带有 的JDialog窗口JTable,并尝试使其对不同的屏幕尺寸具有“响应性”。由于窗口和表格大小可能会发生变化,我按百分比设置列宽度。

此时没有问题。第一次显示该表时,一切看起来都很好。一旦表被重新加载(由于修改或其他原因),列的大小看起来会有所不同,但表和窗口的大小仍然相同。这种情况仅在第一次重新加载时发生,然后每次重新加载时所有内容都保持相同的大小。

我使用JOptionPane消息对话框在每次加载时显示表格宽度,然后我发现了问题。第一次加载表时使用不同的大小(JScrollPane首选大小),然后下一次使用由于调整大小操作而应有的大小。

第一次加载(图片)

http://img1.sycdn.imooc.com/64c320130001e1d309470535.jpg

第二次加载(图)

http://img2.sycdn.imooc.com/64c320210001eec609470536.jpg

真正的问题是为什么?

我已经尝试将调整大小代码移动JDialog到方法上的不同位置initComponents()(创建全局 Dimension 变量),但同样的情况仍然发生。如果我删除调整大小的JDialog代码,一切都会很好,但这是胆怯的方式,哈哈。


暮色呼如
浏览 62回答 1
1回答

慕森王

最初的问题是您initComponents提前调用,即在应用您想要的尺寸之前调用。pack因此,在组件方法中调用initComponents可将面板缩小到最小尺寸。之后您更改了对话框的大小(通过调用setSize(w,h)),但这并没有直接影响所涉及的组件。但是,当对话框设置为visible组件时,组件会自动调整以适合定义的尺寸。这不适用于您的列大小,因为您没有定义ComponentListener会触发此操作的列大小(请参阅下面的第二个示例)。update这导致第一次单击按钮来考虑组件的调整大小,因此它们被应用到列。要解决不同大小的问题,请将构造函数中的方法调用更改为(下面进一步介绍构造函数的完整示例):int w = (int) (Math.round(d.getWidth()) / 2);int h = (int) (Math.round(d.getHeight()) / 2);setPreferredSize(new Dimension(w, h));initComponents();setSize(new java.awt.Dimension(0, 0));您可能想从您的方法中删除initComponents()。如果您想在用户手动调整对话框大小时保持列大小,请考虑添加 a ComponentListener,作为另一个示例,请检查此answer.这也可以用作原始代码的替代解决方案,但首先正确定义大小可能会更清晰。public Test(Dimension d) {    int w = (int) (Math.round(d.getWidth()) / 2);    int h = (int) (Math.round(d.getHeight()) / 2);    setPreferredSize(new Dimension(w, h));    initComponents();    setLocationRelativeTo(null);    bUpdate.addActionListener(new ActionListener() {        public void actionPerformed(ActionEvent e) {            cargarProductos();        }    });    this.addComponentListener(new ComponentAdapter() {         @Override         public void componentResized(ComponentEvent e) {             cargarProductos();         }    });}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java