2013-12-18 2 views
4

JPanel을 중첩하는 방법을 알고 싶습니다. GridLayout을 사용하고 있습니다. 이것이 어떻게 보일 것인가입니다.Java : JPanel을 GridLayout에 중첩하는 방법은 무엇입니까?

enter image description here

나는

  • 가 (단지 JLabel의,

그들의 방법으로도 문제가 해결되지를 사용하여 JPanel들과

  • 를 사용하여, 지금까지 두 가지 방법으로이 문제를 접근 생성 된 첫 번째 패널이 표시됨). 당신은 이미지가 조정되지 않는 것입니다이

    int x=20, y=20; 
        JPanel [] panels = new JPanel[3]; 
        JLabel animal = new JLabel(new ImageIcon(getClass().getResource("Pictures/animal.gif"))); 
        JLabel map = new JLabel(new ImageIcon(getClass().getResource("Pictures/map.gif"))); 
        JLabel mountain = new JLabel(new ImageIcon(getClass().getResource("Pictures/mountain.gif"))); 
    
        for(int i=0;i<panels.length;i++) 
        { 
         if(i>0) 
         { 
          x+=x; 
          y+=y; 
         } 
         panels[i] = new JPanel(new GridLayout(2,2)); 
         panels[i].setPreferredSize(new Dimension(x,y)); 
    
         if(i==0) 
          panels[i].add(new JPanel()); 
    
         else 
          panels[i].add(panels[i-1]); 
    
         panels[i].add(mountain); 
         panels[i].add(map); 
         panels[i].add(animal); 
        }  
        add(panels[2]); 
    
  • +1

    현재 표시되는 항목은 무엇입니까? – fdsa

    +1

    https://www.dropbox.com/s/ub3n8nih5nivfm3/Screenshot%202013-12-18%2019.15.21.png – HishamGarout

    +0

    다른 패널이 추가 된 것 같아서 마지막 JPanel을 추가했습니다 ... – HishamGarout

    답변

    2

    하나의 옵션은 이미지가있는 격자로 분할 된 패널을 나타내는 클래스를 만드는 것입니다. 유일한 문제는 일반적으로 중첩 패널을 포함하는 왼쪽 상단 사분면이며, 어떤 지점에서는이 패널에 빈 패널이 포함되기를 원합니다. 그래서 어쩌면이 같은 (금지 다양한 최적화)는 그리드의 왼쪽 상단 모서리에 표시되는 패널을 받아

    class GridPanel extends JPanel{ 
    
        JLabel mountain, map, animal; 
    
        public GridPanel(JPanel panel){ 
         super(); 
         setLayout(new GridLayout(2, 2)); 
         animal = new JLabel(new ImageIcon(getClass().getResource("pictures/animal.gif"))); 
         map = new JLabel(new ImageIcon(getClass().getResource("pictures/map.gif"))); 
         mountain = new JLabel(new ImageIcon(getClass().getResource("pictures/mountain.gif"))); 
         add(panel); 
         add(mountain); 
         add(map); 
         add(animal); 
        } 
    
    } 
    

    공지있다. 이 coud는 지정된 패널과 함께 호출됩니다. 메인 패널 작성하려는 지점에서 그래서 :

    JPanel grid = new GridPanel(new JPanel()); //initial 
        for(int i = 1; i <= 5; i++){ 
         grid = new GridPanel(grid); 
        } 
        add(grid); 
    

    을 초기 그리드는 빈 JPanel에 생성됩니다. 이후의 모든 그리드에는 이전 패널이 왼쪽 상단 패널로 포함됩니다. 이미지 크기를 조정해야하고 이미지를 여러 번로드하지 않아도됩니다.하지만 이는 또 다른 질문입니다. 이 예제에서는 5 개의 중첩 패널을 보여줍니다.

    이미지를 한 번로드하고 이미지를 다시 사용하려면 ImageIO를 사용해야합니다.

    BufferedImage mointainImg = ImageIO.read(new File("pictures/mountain.gif")); 
    

    을 그리고 당신이 JLabel의를 만들 때이 수행 할 수 있습니다 : 예를 들어, 당신은 당신의 메인 클래스에서이 같은 BufferedImage를 만들 수 있습니다

    mountain = new JLabel(new ImageIcon(mountainImg)); 
    

    을 그리고 이점은 조작 할 수 있다는 것입니다 당신이 원한다면 약간의 이미지.

    +0

    고마워요 :) – HishamGarout

    1

    한 가지 문제 : 다음

    JPanel 방법에 대한 코드입니다. 이미지 크기를 조정하려면 Image.getScaledInstance()을 사용하십시오. 적절한 스케일링은 가시적 인 이미지가 잘리는 문제를 해결할 수 있습니다. 또한 너무 커서 다른 이미지가 보이는 이미지 뒤에 숨어있을 수 있으므로 다른 이미지가 표시 될 수 있습니다.

    관련 문제