gpt4 book ai didi

java - 重绘其他组件时 JLabel 调整大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:33 24 4
gpt4 key购买 nike

我的 Java 布局有问题。我正在尝试将 JLabel 放置在最顶部,然后是五个 WorldWindowGLCanvas 的网格。像这样的东西:

------------------------------------------------
JLabel
------------------------------------------------
|
WWCanvas | WWCanvas
|

------------------------------------------------
|
WWCanvas | WWCanvas
|

我目前在 JPanel 中使用 GridBagLayout。当程序第一次启动时,一切看起来都正常。但是,在第一次重绘所有 WorldWindowGLCanvas 时,顶部 JLabel 的大小立即翻倍并且占用了太多空间。下面是一些相关代码:

JFrame f = new JFrame("ScintDisplay");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridBagLayout());

JLabel timeLabel = new JLabel(getTime(), JLabel.CENTER);
timeLabel.setSize(new Dimension(200,200));


WorldWindowGLCanvas wwd1 = new WorldWindowGLCanvas();
wwd1.setPreferredSize(new java.awt.Dimension(960, 1000));

WorldWindowGLCanvas wwd2 = new WorldWindowGLCanvas();
wwd2.setPreferredSize(new java.awt.Dimension(500, 480));

WorldWindowGLCanvas wwd3 = new WorldWindowGLCanvas();
wwd3.setPreferredSize(new java.awt.Dimension(500, 480));

WorldWindowGLCanvas wwd4 = new WorldWindowGLCanvas();
wwd4.setPreferredSize(new java.awt.Dimension(500, 480));

WorldWindowGLCanvas wwd5 = new WorldWindowGLCanvas();
wwd5.setPreferredSize(new java.awt.Dimension(500, 480));

wwd1.setModel(new BasicModel());
wwd2.setModel(new BasicModel());
wwd3.setModel(new BasicModel());
wwd4.setModel(new BasicModel());
wwd5.setModel(new BasicModel());

addComponent(f, wwd2, 0, 2, 1, 4, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
addComponent(f, wwd1, 1, 2, 2, 8, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
addComponent(f, wwd3, 3, 2, 1, 4, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
addComponent(f, wwd4, 0, 6, 1, 4, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
addComponent(f, wwd5, 3, 6, 1, 4, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
addComponent(f, timeLabel, 0, 0, 4, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);

f.setSize(1920, 1200);
f.setVisible(true);


double lat1 = getTimeLon();

for( ; ; )
{
//System.out.println(lat);
timeLabel.setText(getTime());
System.out.println(timeLabel.getSize());
wwd1.getView().setEyePosition(Position.fromDegrees(0, lat1, 10500000));
wwd2.getView().setEyePosition(Position.fromDegrees(0, 0, 23500000));
wwd3.getView().setEyePosition(Position.fromDegrees(0, 0, 23500000));
wwd4.getView().setEyePosition(Position.fromDegrees(0, 0, 23500000));
wwd5.getView().setEyePosition(Position.fromDegrees(0, 0, 23500000));
wwd1.redraw();
wwd2.redraw();
wwd3.redraw();
wwd4.redraw();
wwd5.redraw();
Thread.sleep(30000);
lat1 = getTimeLon();
}

private static void addComponent(Container container, Component component, int gridx, int gridy, int gridwidth, int gridheight, int anchor, int fill)
{
GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0, 1.0, anchor, fill, insets, 0, 0);
container.add(component, gbc);
}

我以前从未用重绘的 GL 组件做过 GUI。我错过了什么吗?这是一个布局问题。或者与重绘有关?

谢谢,-B

最佳答案

您试图让 GridBagLayout 做太多事情,而应该使用嵌套的 JPanel 来实现这一点。当然,让中心 JPanel 使用 GridBagLayout,但让另一个使用 BorderLayout 的 JPanel 持有它。将中心面板添加到 BorderLayout.CENTER 位置,并将 JLabel 添加到主 BorderLayout - 使用 JPanel 的 BorderLayout.NORTH 或 BorderLayout.PAGE_START 位置。还要确保 JLabel 已设置为以文本为中心显示。

另外,从 Swing 线程的角度来看,您的代码看起来很危险。不间断循环和 Thread.sleep(...) 似乎是在 Swing 事件线程或 EDT 上调用的,这可能会导致您的应用程序卡住。考虑使用 SwingWorker 以允许在后台线程上调用此代码。

关于java - 重绘其他组件时 JLabel 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136602/

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