2012-02-03 5 views
3

Java 레이아웃에 문제가 있습니다. 나는 맨 위에 5 개의 WorldWindowGLCanvas 그리드가있는 JLabel을 배치하려고합니다. 뭔가 같이 :다른 구성 요소를 다시 그릴 때 JLabel의 크기가 조절됩니다.

------------------------------------------------ 
        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

답변

5

이를 달성하기 위해 중첩 된 JPanel의를 사용해야하는 대신 너무 많이 할 GridBagLayout에 물어 노력하고 있습니다. 중앙 JPanel에 GridBagLayout을 사용하게하십시오. 그러나 BorderLayout을 사용하는 다른 JPanel에 의해 보유되도록하십시오. JPanel의 BorderLayout.NORTH 또는 BorderLayout.PAGE_START 위치를 사용하여 가운데 패널을 BorderLayout.CENTER 위치에 추가하고 JLabel을 기본 BorderLayout에 추가합니다. 또한 JLabel이 텍스트 중심으로 표시되도록 설정되었는지 확인하십시오.

또한 스윙 스레드 관점에서 위험한 코드가 있습니다. 정지되지 않는 루프와 Thread.sleep(...)은 Swing 이벤트 스레드 또는 EDT에서 호출되는 것처럼 보입니다. 이로 인해 응용 프로그램이 중단 될 수 있습니다. SwingWorker를 사용하여이 코드를 백그라운드 스레드에서 호출 할 수 있습니다.

+0

+1 rel. 예 어떻게 Thread.sleep (int) 블록 EDT http://stackoverflow.com/a/7944388/714968 – mKorbel

+0

아 감사합니다. 그것은 트릭을했다. 나는 여전히 GUI에 익숙해 져있다. 스레드를 뒤에서 살펴볼 것입니다. 머리를 가져 주셔서 감사합니다. – Brandon

+0

@Brandon : 천만에요. GridBagLayout에 대한 문제 중 일부는 모든 구성 요소에 동일한 가중치 및 가중치 상수를 제공한다는 것입니다. 따라서 GUI가 확장되면 모든 구성 요소가 증가합니다. 그리고 같은 앵커와 채우기를 사용합니다. 나 자신, 나는 GridBagLayout을 사용하고 필요하지 않는 한 그것을 피하는 것이 싫다. –