2012-12-27 42 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