2017-03-16 1 views
0

3 차원 OpenGL 뷰 위에 HUD를 그려보고 싶지만 내 패널에서 수행 된 모든 드로잉이 간과 될 것입니다.GLCanvas를 그릴 방법은 무엇입니까?

여기 베어 본 코드가 있습니다.

MyFrame;

public class MyFrame extends JFrame{ 
    private static final long serialVersionUID = 1L; 
    public MyFrame(Labyrinth l){ 
     super(); 
     this.setTitle("My Frame"); 
     this.setSize(512, 384); 
     this.setContentPane(new MyPanel()); 
     //this.setVisible(true);//If needed here. 
    } 
} 

MyPanel;

public class MyPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    public MyPanel(){ 
     super(); 
     this.setLayout(new BorderLayout()); 
     MyCanvas mc=new MyCanvas(l); 
     mc.setFocusable(false); 
     this.add(this.mc, BorderLayout.CENTER); 
     //this.revalidate();//Doesn't seem needed in the instanciation. 
    } 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     this.mc.repaint(); 
     g.setColor(new Color(128,128,128)); 
     g.fillRect(0, 0, this.getWidth()/2,this.getHeight()/2); 
     //top-left quarter should be greyed away. 
    } 
} 

MyCanvas;

public class MyCanvas extends GLCanvas{ 
    private static final long serialVersionUID = 1L; 
    public MyCanvas(){ 
     super(new GLCapabilities(GLProfile.getDefault())); 
    } 
} 

페인팅이 수행되지만보기에는 표시되지 않습니다. repaint(), paint (Graphics), paintComponent (Graphics) 및 update()를 재정의하려고 시도했습니다. 필자는 "중량급"구성 요소 위에 그림을 그리는 것이 복잡했고 구성 요소에 직접 페인트하거나 다른 유형을 사용해야한다고했습니다. 3D 렌더링을 보여주기 위해서는 분명히 GLCanvas가 필요하며, 동시에 오버레이를 그리는 도구를 제공하지 않는 것 같습니다. 누군가가 단순히 오히려 과잉 보인다 그러나 JFrame의의의 glassPane 내 그림을하라고하고, 나는 내가 그 일을 계획하지 않고있어의 glassPane 주위에 재생 결코 말한 적이 있었어요.

는 내가 본 그림에 많은 주제를 위해 전화를하지만 나는 그런 또는 메서드를 재정의하는 동안 올바른 될 것이라고 설정할 수 없습니다, 나는 오버라이드 (override) 할 필요가 또는 어떤 방법이 있을지 알지도하지 않습니다. 내 간단한 JPanel 그림을 GLCanvas 구성 요소 위에 표시하는 데 놓친 분명한 방법이 있습니까? 모든

답변

0

먼저, 난 정말 그 수단을 통해 HUD를 받고 권하고 싶지 않다. 이 아픔을 많이 상상할 수있을뿐입니다. Java, OpenGL 및 AWT의 그래픽을 혼합 한 적이 한번도 없었습니다.

을 덕트 테이프과 함께 사용하는 대신 JLayeredPane을 사용해보십시오.

JLayeredPane layeredPane = new JLayeredPane(); 

layeredPane.add(new MyCanvas()); 
layeredPane.add(new MyPanel()); 

frame.add(layeredPane); 

이제 중요한 부분은 수동으로 두 구성 요소의 경계를 설정해야한다는 것입니다 : 당신이 같은 문제가 될 겁니다하지 않으면

canvas.setBounds(x, y, width, height); 
panel.setBounds(x, y, width, height); 

을하기 전에 :

그림이 나타나지만보기에 표시되지 않습니다.

작업은 나는 당신의 MyPanel와 유사한이 작은 TestPanel 클래스를 만들었습니다.

public static class TestPanel extends JPanel { 
    private Color color; 

    public TestPanel(Color color) { 
     this.color = color; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(color); 
     g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); 
    } 
} 

다음과 같이 두 개의 인스턴스를 생성 :

JPanel panel1 = new TestPanel(new Color(255, 0, 0)); 
panel1.setBounds(25, 25, 100, 100); 

JPanel panel2 = new TestPanel(new Color(0, 0, 255)); 
panel2.setBounds(75, 75, 100, 100); 

그런 다음 JLayeredPane에 추가하고 우리가 참조하십시오 JFrame하고이 것을 추가 :

+0

이 가능한 것 레이어 패널을 따라 자식 패널의 크기를 조정하려면? 내 생각에 LP의 repaint 메서드를 재정의하여 차원을 변경하면 구성 요소의 플래그를 설정할 수 있습니다.어쨌든, 내가 원했던 것입니다. 고마워요. – Moige

+0

다른 질문이 있는데, 다른 주제로는 나을 수 없습니다. 맨 위로 JPanel의 칠해지지 않은 부분을 어떻게 볼 수 있습니까? 지금은 GLCanvas를 통해 패널의 왼쪽 상단 만 그리려고 할 때 [http://imgur.com/a/7m65O](http://imgur.com/a/7m65O)와 같은 것을 얻을 수 있습니다. . 그것은 좋지만 충분하지 않습니다. (편집 : 그것은 setOpaque (false); with panel instanciation) – Moige

+0

크기를 조정할 때'ComponentListener'를 사용하고'componentResized'에서 자식 패널의 크기를 조정할 수 있습니다. 'paintComponent'를 오버라이드하고'super.paintComponent'를 호출하지 않고 색상이있는 패널을 지우지 않는 투명성 문제에 대해서는 그 문제가 없어야합니다. – Vallentin

관련 문제