2012-12-27 253 views
2

我有一個使用Netbeans的GUI構建器創建的JFrame,它只包含一個JPanel。我創建了一個方法getPanel爲得到一個參照此JPanel:無法在JPanel上繪製橢圓

public class ShowDrawings extends JFrame { 

    public ShowDrawings() { 
     initComponents(); 
    } 

    public JPanel getPanel(){ 
     return panel; 
    } 

    private JPanel panel; 
} 

在我的主要功能我做:

public class Main { 
    public static void main(String[] args){ 
     ShowDrawings sd = new ShowDrawings(); 
     sd.setSize(800, 600); 
     Graphics g = sd.getPanel().getGraphics(); 
     g.setColor(Color.BLACK); 
     g.drawOval(400, 300, 50, 50); 
     sd.getPanel().paint(g); 
     sd.repaint(); 
     sd.setVisible(true); 
    } 
} 

但它不畫任何東西。請幫幫我。 我看了一些相關的問題,但他們都建議擴展JPanel並覆蓋它的paint方法。但我不想這樣做。 謝謝。

+0

如果您使用Netbeans的GUI生成器,它不應該引起任何問題。我已經使用過很多次了。您可以發佈完整的代碼嗎? –

回答

5

我已經看過一些相關的問題,但他們都暗示 延伸JPanel並覆蓋其paint方法。但我不想 做這樣

你不應該重寫JPanelpaint()方法,而paintComponent(..)。這是最佳實踐,如果您想要不會產生異常的代碼,應該這樣做。也做在你目前的做法(如你所看到的),使創建持久的圖紙了很多困難,因爲他們抹不去的repaint()

而是擴展JPanel並覆蓋paintComponent(Graphics g)不忘打電話super.paintComponent(g)在重寫paintComponent(..)方法第一個電話。也不要忘了覆蓋的JPanelgetPreferredSize()這樣我們就可以返回正確的尺寸和pack()可在JFrame被稱爲(+1至@mKorbels評論):

下面是一些示例代碼:

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    public Test() { 
     initComponents(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 

    private void initComponents() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel testPanel = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics grphcs) { 
       super.paintComponent(grphcs); 

       Graphics2D g2d = (Graphics2D) grphcs; 

       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

       g2d.setColor(Color.GREEN); 
       //g2d.drawOval(10,10,100,100);//I like fill :P 
       g2d.fillOval(10,10,100,100); 

      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(150, 150); 
      } 
     }; 

     frame.add(testPanel); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

對於圓形和其他省略號,您可能還需要'g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE)',請參閱http://stackoverflow.com/a/ 1143274分之31221395 –

3

第一次你repaint()你的ShowDrawings sd框架任何你畫這樣的(sd.getPanel().getGraphics().drawOval(...))將被原始JPanel#paintComponent()方法刪除。

由於Andrew Thompson has written

不要使用Component.getGraphics()。相反,子類並重寫paint()(AWT)或paintComponent()(Swing)方法。

Component.getGraphics()根本無法工作。 Java使用回調機制來繪製圖形。您不應該使用getGraphics()將圖形信息「推送」到組件中。相反,您應該等到Java調用您的paint()/ paintComponent()方法。那時你應該爲Component提供你想要的圖紙。

如果你只是檢查/調試的東西,你甚至可以做這樣的事情:

class Test { 
    private JPanel panel = new JPanel() { 
     public void paintComponent(Graphics g) { 
      g.setColor(Color.BLACK); 
      g.drawOval(400, 300, 50, 50); 
     } 
    }; 
} 
+2

,然後必須重寫JPanel的PreferredSize :-) – mKorbel