2011-12-07 1 views
2

JLayeredPane에 JPanel (우물, 몇개)을 추가하려고하고 있습니다. 그러나 그렇게 할 때 JPanel의 페인트 구성 요소 메서드는 아무 효과가없는 것 같습니다. 예를 들면 다음과 같습니다.JLayeredPane에 JPanel을 추가하면 (자), 페인트와 사이즈 변경이 유효하지 않게됩니다.

import javax.swing.*; 
import java.awt.*; 

public class Example { 

    public static void main(String[] args) { 

     // This Works as expected 
     JFrame usingPanel = new JFrame(); 
     JPanel p = new JPanel(); 
     p.add(new BluePanel()); 
     usingPanel.setContentPane(p); 
     usingPanel.pack(); 
     usingPanel.setVisible(true); 

     // This makes the frame but does not paint the BluePanel 
     JFrame usingLayer = new JFrame(); 
     JLayeredPane l = new JLayeredPane(); 
     l.setPreferredSize(new Dimension(200,200)); 
     l.add(new BluePanel(), JLayeredPane.DEFAULT_LAYER); 
     JPanel p2 = new JPanel(); 
     p2.add(l); 
     usingLayer.setContentPane(p2); 
     usingLayer.pack(); 
     usingLayer.setVisible(true); 
    } 


    static class BluePanel extends JPanel{ 

     public BluePanel(){ 
      setPreferredSize(new Dimension(200,200)); 
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.BLUE); 
      g.fillRect(0, 0, 200, 200); 
     } 


    } 


} 

왜 그런가요? 가능한 해결책은 무엇입니까?

답변

8

JLayeredPane에는 LayoutManager가 없으므로 패널의 위치와 크기를 직접 설정해야합니다. 추가하는 방법을 tutorial

1
  1. 가 화면에 크기를 하드 코딩 참조

    g.fillRect(0, 0, getWidth(), getHeight()); 
    
  2. (경미한 변경)에

    g.fillRect(0, 0, 200, 200); 
    

    에서 변경해야

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

    다음 코드 줄 제거 setPreferredSize(new Dimension(200,200));

관련 문제