为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2023-07-28 09:54:51
我正在创建一个带有 的JDialog窗口JTable,并尝试使其对不同的屏幕尺寸具有“响应性”。由于窗口和表格大小可能会发生变化,我按百分比设置列宽度。此时没有问题。第一次显示该表时,一切看起来都很好。一旦表被重新加载(由于修改或其他原因),列的大小看起来会有所不同,但表和窗口的大小仍然相同。这种情况仅在第一次重新加载时发生,然后每次重新加载时所有内容都保持相同的大小。我使用JOptionPane消息对话框在每次加载时显示表格宽度,然后我发现了问题。第一次加载表时使用不同的大小(JScrollPane首选大小),然后下一次使用由于调整大小操作而应有的大小。第一次加载(图片)第二次加载(图)真正的问题是为什么?我已经尝试将调整大小代码移动JDialog到方法上的不同位置initComponents()(创建全局 Dimension 变量),但同样的情况仍然发生。如果我删除调整大小的JDialog代码,一切都会很好,但这是胆怯的方式,哈哈。
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

最初的问题是您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();

         }

    });

}


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信