gpt4 book ai didi

java - GridbagLayout - 在 c.fill = BOTH 时获取 ButtonSize

转载 作者:行者123 更新时间:2023-11-29 05:41:31 25 4
gpt4 key购买 nike

我不太习惯 Java 和 Swing,但我需要一个学校项目的答案:)

我有一个 JButton,它通过 GirdbagLayout 拉伸(stretch)到它的父宽度/高度:

frame = new JFrame();
frame.setResizable(false);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);

Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
contentPane.setVisible(true);

JButton test = new JButton("TEST");
c.gridx = 0; c.gridy = 0; c.ipadx = 30; c.ipady = 30; c.weightx = 1; c.weighty = 1; c.fill = GridBagConstraints.BOTH;
test.setVisible(true);
contentPane.add(test, c);

frame.setVisible(true);

现在,我需要获取按钮的宽度。原因:按钮的字体大小是相对于按钮的大小计算的(对于此计算,需要其宽度。)。

System.out.println("BUTTON WIDTH "+test.getWidth());

test.getWidth() 为零 :((这是在 pane、frame 和 Button 设置为可见后调用的)。

我能做什么:)

提前致谢


更新:

根据 Yohan Danvin 的建议,我使用了 frame.pack()。但是行为变得有点奇怪:好像大小的变化是动画的(cfr.css-transitions - 这就是我有时会遇到类似问题的地方),它在大约 30 毫秒内发生变化:

frame.pack();
frame.setVisible(true);

System.out.println(test.getWidth());
for(int i=0; i<10; i++){
try{
Thread.sleep(10);
System.out.println(test.getWidth());
} catch(Exception err){}
}

第一个和第二个输出是“93”,其他 9 个是“1600”(正确的是)。这次会发生什么?为什么要改变宽度?

期待任何人给我启发:)


更新:

这样就可以了,计算出正确的宽度:

import javax.swing.*;
import java.awt.*;

public class VIEW{
private JFrame frame;

public VIEW(){
frame = new JFrame();
frame.setResizable(false);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);

Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridBagLayout());
contentPane.setVisible(true);
GridBagConstraints c = new GridBagConstraints();

JButton test = new JButton("TEST");
c.gridx = 0; c.gridy = 0; c.ipadx = 30; c.ipady = 30; c.weightx = 1; c.weighty = 1; c.fill = GridBagConstraints.BOTH;
test.setVisible(true);
contentPane.add(test, c);

frame.pack();
frame.setVisible(true);

System.out.println(this.getWidth(test));
}

private int getWidth(JButton button){
try{
int i = 0, width = 0;
while(i++ < 10 && (width = button.getWidth()) < 100)
Thread.sleep(10);
return width;
} catch(Exception err){
return 0;
}
}
}

当然,使用 Thread.sleep 等待有点老套 :)(特别是等待值大于 100... - 这可能只适合这个例子,甚至可能只适合我的屏幕分辨率。 )

请随意将此类复制到您的 IDE 中并尝试一下:)


最终更新:

SwingUtilities.invokeLater(new Runnable(){
public void run(){
System.out.println(test.getWidth());
}
});

==> 等待窗口最大化。完美。

问题解决:)

最佳答案

问题是按钮的大小还没有计算出来。尝试调用:

frame.pack();

在使框架可见之前,先获取宽度。

更新:
我认为你遇到这个问题是因为你使用了 frame.setExtendedState(JFrame.MAXIMIZED_BOTH);,不幸的是一开始并没有考虑到这一点(= by .pack()).
我认为您别无选择,只能等待窗口完全最大化才能获得正确的值。

使用 SwingUtilities.invokeLater(/*在此处获取宽度*/); 而不是自定义线程 hibernate 。这是在处理完所有操作系统事件(包括我正在考虑的窗口最大化)后运行代码的更标准方法。

关于java - GridbagLayout - 在 c.fill = BOTH 时获取 ButtonSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390828/

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