2014-04-12 1 views
2

신기한 실수를하고 있지만 JFrame의 JPanel에 대한 GridLayout을 만들 때 행 매개 변수를 변경하면 다른 JPanel이 내 레이아웃을 설정 GridBug 생성자에서이상한 스윙 오류 : GridLayout 매개 변수를 설정하면 JPanel이 사라집니다.

  • 및 BorderLayout.CENTER에 JPanel을의 하위 클래스를 넣어 :

    여기에 코드의 버전을 박탈이다 : 모두 사라진다. 이것은 원래 코드에있는 다른 것들을 수행하지만, 여기에 표시되는 것을 보여주기위한 상자를 그립니다.

  • 래도 BorderLayout.PAGE_END 첨가되는 바닥 패널의 상태 값이 낮을수록 잘 동작, 상기 중앙 패널은 높은 값이 소멸하는 중앙 패널을 유발하는 GridLayout과 행 파라미터를 변경, 특히
  • 를 소멸시킨다
  • 그때가 작동 JLabel의 또는 서브 패널을 추가하지 않는 경우
  • 코드는 지금처럼 ... 내가 코드의 일부를 주석을 해제하는 경우 행 매개 변수를 줄이기 위해, 내 컴퓨터에서 작동하지 않거나

내가 뭘 잘못하고 있는지 전혀 모르겠다.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class GridBug extends JFrame{ 

    static class ImagePanel extends JPanel{ 

     @Override 
     public Dimension getPreferredSize(){ 
      return new Dimension(200,200); 
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      System.out.println("Painting image panel..."); 
      g.setColor(Color.CYAN); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
     } 
    } 

    public GridBug() { 

     setLayout(new BorderLayout()); 

     /*PROBLEM CODE HERE*/ 

     //add center image panel - does not appear depending on GridLayout settings in other panels 
     ImagePanel centerPanel = new ImagePanel(); 
     add(centerPanel , BorderLayout.CENTER); 

     //add bottom panel 
     JPanel bottomPanel = new JPanel(); 
     add(bottomPanel, BorderLayout.PAGE_END); 
     bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work 
//    bottomPanel.setLayout(new GridLayout(5,0)); //works 

     JPanel subPanel = new JPanel(); 

     //if I pass more than 4 or so rows as param to gridlayout, 
     //then imagePanel is not displayed 
     subPanel.setLayout(new GridLayout(4,0)); //doesn't work 
//    subPanel.setLayout(new GridLayout(3, 0)); //works 


     //if I don't add this label - works 
     JLabel label = new JLabel("A Label:"); 
     subPanel.add(label); 

     bottomPanel.add(subPanel); //if I don't add the subPanel it works fine 

     /*END OF PROBLEM CODE?*/ 

     //set window params 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400,400); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static final void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new GridBug(); 
      } 
     }); 
    } 
} 

답변

3

정확한 결과를 원하지 않으므로 시도하지 않았습니다. 그러나 당신이 직면하고있는 문제는 이유 중 하나입니다. pack()setSize()이 아니라고 말하고 싶습니다. 구성 요소의 기본 크기를 제한하고 있습니다. pack()는 모든 구성 요소의 적절한 사이즈를 존중하고, 지금 원하는 모양 :


를 얻기 위해 당신은 단지 당신의 구성 요소의 레이아웃 작업을 할 필요가 setSize()

bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work.. 
              // with pack(), now it does. 
pack(); 
//setSize(400,400); // if you increase the size it'll work also, but just pack() 

보다는, 사용되어야한다

문제에 대한 자세한 설명. 나는 배경을 설정할 때이 현재 코드를 어떻게

enter image description here

보인다. 참고 : setSize()이 상단 패널의 기본 크기 (200, 200)에 부담을주고 있음을 이미 확인할 수 있습니다.

  • 상단 CYAN은 이미지 패널입니다.
  • 파란색은 subPanel이고 4 행입니다. GridLayout을 사용하면 모든 행이 최소한 최대 구성 요소의 크기가됩니다. 이 경우 레이블입니다. 파란색 영역은 라벨 높이의 4 배입니다 (반드시 있어야 함)
  • 빨간색이 아니고 bottomPanel입니다. 여기에는 5 개의 행이 있습니다. 가장 큰 구성 요소는 subPanel이므로 bottomPanel의 전체 크기는 subPanel x5 크기입니다. 다른 행을 추가하면 상단 패널이 밀려납니다.
+0

감사합니다. 나는 setSize()를 사용하지 않았고 이번에는 설정하지 않았다. 나는 다른 코드의 대중을 테스트하는 데 오랜 세월을 보냈다. 완전히 다른 문제라고 생각하고 그 한 줄만 남겼다. – mallardz

관련 문제