JLabel изменяет размеры при перерисовке других компонентов - PullRequest
3 голосов
/ 04 февраля 2012

У меня проблема с моим макетом Java.Я пытаюсь разместить JLabel на самом верху, следуя сетке из пяти WorldWindowGLCanvas.Примерно так:

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

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

В настоящее время я использую GridBagLayout внутри JPanel.При первом запуске программы все выглядит как надо.Тем не менее, при первой перерисовке всех 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);
    }

Я никогда не делал GUI с компонентами GL, которые перерисовывались ранее.Я что-то пропустил?Это проблема макета.или что-то связанное с перерисовкой?

Спасибо, -B

1 Ответ

5 голосов
/ 04 февраля 2012

Вы пытаетесь попросить GridBagLayout делать слишком много, и вместо этого следует использовать вложенные JPanels для достижения этой цели.Разумеется, в центре JPanel используется GridBagLayout, но его должен удерживать другой JPanel, использующий BorderLayout.Добавьте центральную панель в положение BorderLayout.CENTER, а JLabel - в основную BorderLayout, используя позицию BorderLayout.NORTH или BorderLayout.PAGE_START в JPanel.Также убедитесь, что JLabel настроен на отображение текста по центру.

Кроме того, у вас есть код, который выглядит опасно с точки зрения потоков Swing.Этот цикл без остановки и Thread.sleep(...) кажутся вызванными в потоке событий Swing или EDT, и это может привести к зависанию вашего приложения.Попробуйте использовать SwingWorker, чтобы этот код вызывался в фоновом потоке.

...