2011-12-30 87 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我將背景設置爲黑色,但沒有效果?

上述兩個問題的原因是什麼?請幫忙!

+0

您通常在初始化組件時設置背景色,而不是在繪製方法中。嘗試將該行移至構造函數。 - 對於加倍問題:這只是一個猜測,但嘗試添加此行之前打開框架:'System.setProperty(「sun.java2d.noddraw」,「true」);' – Thomas 2011-12-30 07:26:57

+0

嘿謝謝,移動(或評論)這行'setBackground(Color.BLACK);'從paint到構造函數解決了雙線和菜單的問題。但面板仍然不是黑色。也許你應該添加你的評論作爲答案。順便說一句'setProperty'沒有幫助。 – 2011-12-30 07:39:57

回答

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()! – 2011-12-30 08:20:06

+0

解決了問題!是的@JBNizet - 請取消刪除您的帖子。 – 2011-12-30 08:29:29

+1

我將其刪除。它更具信息性,但並不像您的解決方案那樣正確。 – 2011-12-30 08:39:34

3

的Javadoc提到

  • isOpaque必須是真實的
  • ,取決於在L &女,這個屬性可以被忽略
  • 是JComponent的子類必須重寫paintComponent以遵守此屬性。

將setBackground放在構造函數中,並在paintComponent(在繪製紅色線條之前)中添加這兩行代碼使面板變黑。

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

另請注意,應始終在EDT中創建和修改Swing組件。您的主要方法應該是這樣的:

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

你是在暗示多線程?嗯,將不得不學習它。 – 2011-12-30 08:42:03

+0

我不是建議多線程。所有的擺動組件只能由單個線程使用:事件調度線程。您的代碼正在主線程中使用組件。請參閱http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading,它由每個swing組件的javadoc鏈接到。 – 2011-12-30 08:47:18