2012-06-25 4 views
1

좋은 하루,JLayeredPane 그림이 아닙니다

희망적인 것은 신속한 질문입니다. JPanels 및 JLayeredPane을 JFrame 내부에서 사용하는 응용 프로그램을 작성 중입니다. 응용 프로그램을 처음 시작할 때 패널이 있어야하는 영역 위로 마우스를 움직일 때까지 패널 중 하나가 표시되지 않습니다. 나는 validate 및 repaint 메소드를 호출하기도하지만 두 패널을 함께 표시 할 수 있습니다. 어떤 제안? 고맙습니다. 여기

은 (주 메소드가) 내 JFrame의 클래스 다음

import java.awt.Dimension; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 


public class Application extends JFrame 
{ 
    public Application() 
    { 
     this.setSize(500,500); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 

     JLayeredPane lp = new JLayeredPane(); 
     lp.setBounds(0,0,500,500); 
     this.setLayeredPane(lp); 

     Mypanel p1 = new Mypanel(); 
     Mypanel2 p2 = new Mypanel2(); 

     this.getLayeredPane().add(p1,0); 
     this.getLayeredPane().add(p2,1); 

     this.validate(); 
     this.repaint(); 
     this.validate(); 
    } 


    public static void main(String[] args) 
    { 
     Application app = new Application(); 

    } 
} 

내 패널 클래스 마지막으로

import javax.swing.JButton; 
import javax.swing.JPanel; 

public class Mypanel extends JPanel 
{ 
    public JButton button; 

    public Mypanel() 
    { 
     this.setLayout(null); 
     this.setBounds(0, 0, 500, 500); 
     JButton b = new JButton("Hello"); 
     b.setBounds(20,20,300,300); 
     this.add(b); 
    } 
} 

그리고 내 마지막 패널 클래스 중 하나입니다

import javax.swing.JButton; 
import javax.swing.JPanel; 


public class Mypanel2 extends JPanel 
{ 
    public JButton button; 

    public Mypanel2() 
    { 
     this.setLayout(null); 
     this.setBounds(0, 0, 500, 500); 
     JButton b = new JButton("SUP"); 
     b.setBounds(20,10,200,200); 
     this.add(b); 
     this.repaint(); 
     this.validate(); 
     this.repaint(); 
    } 
} 

답변

1

먼저 올바른 프로그램에서 JComponent 만 다시 칠합니다. 어떤 점에서 컨트롤러 코드에서 c.repaint()이라는 호출을하면 문제가 해결된다는 것을 알게되면 스윙 프레임 워크의 핵심 부분 인 기본 계약을 무시하게됩니다. 그리고 이것은 결코 좋은 생각이 아닙니다. 그러므로 repaintvalidate 호출을 모두 제거하는 것이 좋습니다. 다음으로 중요한 것은 경량 스윙 구성 요소가 자녀에게 그림을 그리는 방법을 이해하는 것입니다. 최적화 및 최적화되지 않은 두 가지 모드가 있습니다. 첫 번째 것은 형제가 컨테이너에서 서로 겹치지 않는 경우에만 적용 할 수 있습니다. 그들이하고 최적화 된 그림이 켜져 있다면, 마우스 포인터를 가져갈 때처럼 그 구성 요소가 다시 칠해지면 모든 종류의 이상한 행동을 취하게 될 것입니다. 모든 가벼운 구성 요소는 setComponentZOrder()을 통해 겹치는 하위 항목을 처리 할 수 ​​있습니다. JLayeredPane은보다 유연한 방법으로 zorder를 제어하는 ​​수단으로 레이어 개념만을 도입합니다. 그것은 아이들에게 페인트하기 위해 어떤 모드를 선택할지에 대해 영리하려고 시도하지만, 슬프게도 이것이 어떻게 작동하는지에 대한 미묘한 차이가 있습니다. 그래서이 코드는 당신이 필요로 할 것 :

Mypanel p1 = new Mypanel(); 
Mypanel2 p2 = new Mypanel2(); 

getLayeredPane().setLayer(p1,0); 
getLayeredPane().setLayer(p2,1); 

getLayeredPane().add(p1); 
getLayeredPane().add(p2); 

과이되지 것 :

Mypanel p1 = new Mypanel(); 
Mypanel2 p2 = new Mypanel2(); 

getLayeredPane().add(p1); 
getLayeredPane().add(p2); 

getLayeredPane().setLayer(p1,0); 
getLayeredPane().setLayer(p2,1); 

트릭은 컨테이너에 아이를 추가하기 전에 JLayeredPane를 최적화 그림을 해제 할 수 있도록 setLayer를 호출하는 것입니다 .

동의어 왜 JLayeredPane일까요? 레이아웃간에 프로그래밍 방식으로 전환해야하는 경우 어쨌든 JTabbedPane이 대답입니다.

+0

안녕하세요! 큰 반응에 감사드립니다. 그래서 여기에 내가 정말로하려고하는 것이 있습니다 ... 저는 2D 게임이 될 백그라운드에서 버퍼링 된 이미지를 가지고 있습니다. 내 자신의 버튼과 텍스트 필드 클래스를 작성하고 싶지 않아서 내 이미지가 포함 된 레이어의 레이어를 ontop 할 예정이었습니다. 당신은 그 일을하는 방법에 대해 더 잘 알고 있습니까? – Matthew

+0

그 경우에는'JLayeredPane' 대신'GlassPane'을 사용해야 할 수도 있습니다! http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html –

+0

필요한 것을 수행 할 수있는 방법은 많습니다. 우선 내 자신의'JPanel' 서브 클래스를 만들고, 불투명 속성을 true로 설정 한 다음,'paintComponent'를 오버라이드하여 버퍼 이미지를 그립니다. 이미지를 그리기 위해 JLabel 또는 JButton을 가질 필요가 없습니다. add()/remove() 메소드를 통해 JTextField 또는 JButton과 같은 다른 스윙 컴포넌트를 추가/제거 할 수 있습니다. 단순한! BTW 그것은 모든 마우스 처리/그림을 단일 구성 요소에 캡슐화하는 데 도움이됩니다.내 경험에 MVC 원칙을 준수 항상 갚을. 데스크톱/게임 개발 분야의 전문가. –

0
JLayeredPane lp = new JLayeredPane(); 
JPanel d = new JPanel(); 
d.setVisible(true); 
d.setBounds(10, 10, 556, 386); 
lp.add(d, new Integer(0), 0); 
+0

Stack Overflow에 오신 것을 환영합니다. 코드와 함께 설명을 해 주시겠습니까? –

관련 문제