2012-02-03 7 views
3

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

------------------------------------------------ 
        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); 
    } 

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

Спасибо, -B

ответ

5

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

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

+0

+1 rel. пример, как Thread.sleep (int) block EDT http://stackoverflow.com/a/7944388/714968 – mKorbel

+0

Ах спасибо. Это сделал трюк. Я все еще привык к работе с GUI. Я также рассмотрю вопрос о потоке. Спасибо за головы. – Brandon

+0

@Brandon: Добро пожаловать. Я думаю, что часть вашей проблемы с GridBagLayout заключается в том, что вы предоставляете всем компонентам одинаковые весовые и весомые константы, и поэтому, когда GUI расширяется, все компоненты увеличиваются. И вы используете те же самые якоря и заливки. Я ненавижу использование GridBagLayout и избегаю его, если это необходимо. –

 Смежные вопросы

  • Нет связанных вопросов^_^