当重新绘制其他组件时,JLabel会重新调整大小。

3

我遇到了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

1个回答

5
您正在尝试让GridBagLayout做过多的工作,而应该使用嵌套的JPanels来实现。确保中心JPanel使用GridBagLayout,但它由另一个使用BorderLayout的JPanel持有。将中心面板添加到BorderLayout.CENTER位置,将JLabel添加到主BorderLayout-using JPanel的BorderLayout.NORTH或BorderLayout.PAGE_START位置。还要确保已将JLabel设置为居中显示其文本。
此外,从Swing线程角度来看,您的代码似乎存在危险。该非停止循环和Thread.sleep(...)似乎在调用Swing事件线程或EDT,并且这可能导致应用程序冻结。考虑使用SwingWorker以允许在后台线程上调用此代码。

+1 个相关的例子,展示 Thread.sleep(int) 如何阻塞 EDT。https://dev59.com/nlzUa4cB1Zd3GeqP57hX#7944388 - mKorbel
啊,谢谢。这就解决了问题。我还在适应 GUI 方面的东西。我也会研究如何将线程后台化。感谢提醒。 - Brandon
@Brandon:不用谢。我认为你在使用GridBagLayout时的一个问题是,你给所有组件相同的weightx和weighty常量,因此当GUI扩展时,所有组件都会增加。而且你还使用了相同的anchors和fills。我个人非常讨厌使用GridBagLayout,除非必要。 - Hovercraft Full Of Eels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接