2011-12-30 9 views
2

次の単純なコードでは、フレームを作成してJPanelmenubarを追加するだけです。JFrameでの奇妙な表示の問題

public class MainFrame extends JFrame { 
    private DrawPanel drawPanel; 
    public MainFrame() 
    { 
     super("Coordinate Geometry Visualiser"); 
     drawPanel = new DrawPanel(); 
     add(drawPanel); 

     JMenu fileMenu = new JMenu("File"); 
     fileMenu.setMnemonic('F'); 

     JMenuItem newItem = new JMenuItem("New"); 
     newItem.setMnemonic('N'); 
     fileMenu.add(newItem); 

     JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 
     menuBar.add(fileMenu); 

     JMenu editMenu = new JMenu("Edit"); 
     editMenu.setMnemonic('E'); 
     menuBar.add(editMenu); 
    } 
} 

ドローパネルコード -

public class DrawPanel extends JPanel { 
    public DrawPanel() 
    { 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponents(g); 
     setBackground(Color.BLACK); 
     g.setColor(Color.RED); 
     g.drawLine(100, 50, 150, 100); 
    } 
} 

し、最終的に日食内でアプリケーションを実行するにはmain()

public class CGVApplication { 
    public static void main(String[] args) { 
     MainFrame appFrame = new MainFrame(); 
     appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     appFrame.setSize(300, 275); 
     appFrame.setVisible(true); 
    } 
} 

を持つアプリケーション、これは私が得るものです - enter image description hereenter image description here

なぜダブルメニューバー?これは非常に迷惑です。アプリケーションを循環したり、ポップアップが表示されたときに、再描画されたウィンドウがきれいです(右側の画像)。

また、私のDrawPanelpaintComponent私は背景を黒に設定しましたが効果はありませんか?

上記の2つの問題の原因は何ですか?助けてください!

+0

通常、コンポーネントの初期化時に背景色を設定します。ペイント方法では使用しません。その行をコンストラクタに移動してみてください。 - 倍増問題については、それは単なる推測ですが、フレームを開く前にこの行を追加してみてください: 'System.setProperty(" sun.java2d.noddraw "、" true ");' – Thomas

+0

ありがとう、移動(またはコメント) line 'setBackground(Color.BLACK);'ペイントからコンストラクタまで二重線とメニューの問題を解決しました。しかしパネルはまだ黒ではない。たぶんあなたは答えとしてあなたのコメントを追加する必要があります。 BTWの 'setProperty'は役に立たなかった。 –

答えて

5

あなたはContainer.paintComponents()メソッドを呼び出しています。 super.paintComponent(g)である必要があります。

@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); //super.paintComponents(g); 
    setBackground(Color.BLACK); 
    g.setColor(Color.RED); 
    g.drawLine(100, 50, 150, 100); 
} 
+2

+1:スーパーでsを気付かなかった。paintComponents()! –

+0

問題を解決しました!そしてはい@JBNizet - あなたの投稿を元に戻してください。 –

+1

私はそれを元に戻しました。より有益ですが、あなたの問題と同じように問題は解決しません。 –

3

Javadocは

  • イソパークはL & Fに応じて、このプロパティはJComponentののサブクラスは、paintComponentをオーバーライドする必要があります
  • このプロパティを称えるために無視されることがあり
  • 真でなければならないことに言及しています。

setBackgroundをコンストラクタに入れ、paintComponentにこれらの2行のコードを追加すると(赤い線を塗る前に)パネルが黒くなります。

g.setColor(getBackground()); 
g.fillRect(getX(), getY(), getWidth(), getHeight()); 

また、スウィングコンポーネントはEDTで作成および変更する必要があります。主な方法は次のようにする必要があります。

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      MainFrame appFrame = new MainFrame(); 
      appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      appFrame.setSize(300, 275); 
      appFrame.setVisible(true); 
     } 
    }); 
} 
+1

マルチスレッドをお勧めしますか?うーん、それを学ばなければならないだろう。 –

+0

私はマルチスレッドを提案していません。すべてのスイングコンポーネントは、イベントディスパッチスレッドという1つのスレッドのみが使用できます。あなたのコードは、メインスレッドのコンポーネントを使用しています。すべてのスイングコンポーネントのjavadocにリンクされているhttp://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threadingを参照してください。 –