2017-03-16 15 views
0

3D 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の周りを遊んではいけないと言われています。

私は絵の呼び出しの順序について多くのトピックを見てきましたが、そのような方法をオーバーライドしている間は正しいとは確信できません。 GLCanvasコンポーネント上に表示された簡単なJPanelの絵を見逃してしまったという明白な方法はありますか?

答えて

0

まず、これらの方法でHUDを取得することはまずありません。私はこの傷ついたパフォーマンスをたくさん想像することができます。 Java、OpenGL、AWTのGraphicsを混ぜてみたことはありません。

これらのクラスをダクトテープとともに使用する代わりにを使用する代わりに、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); 
    } 
} 

次に、このように2つのインスタンスを作成:

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

ことが可能だろう子パネルをlayeredPaneに沿ってサイズ変更するには?私は、ディメンションが変更されたときにコンポーネントのフラグを設定するためにLPの再描画メソッドをオーバーライドすると思います。それにもかかわらず、これは私が欲しかったことです、ありがとう。 – Moige

+0

私はあなたのために別の質問をしていますが、それは別の話題にはならないでしょう。一番上のJPanelの塗装されていない部分をどうやって見ることができますか?今はGLCanvas上のパネルの左上の四半分のみを描画しようとすると[http://imgur.com/a/7m65O](http://imgur.com/a/7m65O)のようなものが表示されます。いいですが、十分ではありません。 (編集:これはsetOpaque(false);パネルインスタンシエーションの場合) – Moige

+0

リサイズの場合、 'ComponentListener'を使用し、' componentResized'の子パネルのサイズを変更することができます。 'paintComponent'をオーバーライドし、' super.paintComponent'を呼び出さず、色でパネルをクリアしないという透明性の問題については、その問題はそこにあってはなりません。 – Vallentin

関連する問題