2017-02-27 81 views
-1

我试图了解一个油漆图形,但我的椭圆形不能绘制。有人可以告诉我我做错了什么,椭圆形不是绘图吗? 我在哪里犯了一个错误?为什么椭圆不能绘制?

主要类:

import java.awt.EventQueue; 
public class Main { 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      Frame frame = new Frame(); 

     } 
    }); 
} 

Frame类:

public class Frame extends JFrame { 
private static final long serialVersionUID = 1L; 

public static Grafika grafika; 

public Frame() { 
    JFrame frame = new JFrame("Title"); 
    grafika = new Grafika(); 

    frame.setSize(500, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setLayout(null); 
    // frame.addKeyListener(this); 
    frame.add(grafika); 
} 
} 

而在去年GRAFIC类:

public class Grafika extends JComponent { 

int x = 200; 
int y = 200; 

public void paint(Graphics g) { 

    Graphics2D oval = (Graphics2D) g; 
    oval.setColor(Color.BLACK); 
    oval.fillOval(x, y, 100, 100); 
    oval.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON); 

} 
} 
+0

如果您的框架类扩展了JFrame,为什么要在框架构造函数中创建一个新的JFrame?你已经是一个JFrame。 – FredK

回答

3

几个问题,但最大的是,您使用的是空在您的JFrame上进行布局,然后添加首选大小和大小均为0,0的JComponent。所以,当你将你的Grafika添加到JFrame中时,它没有被显示的机会。

建议:

  • 切勿使用null布局,除在非常特殊的情况除外。
  • 给你Grafika分量的首选大小,最好通过重写getPreferredSize(),但在这个阶段,我认为这将是确定调用setPreferredSize(...)就可以了。
  • 将它添加到JFrame,pack() JFrame中,然后最后,只有在所有组件都被添加到JFrame,使其可见。

而且

  • 你应该是压倒一切的paintComponent不画
  • 你应该打电话给你的覆盖范围内的超级画法。
  • 始终使用@Override注释,当你认为你要覆盖父方法。你可能是错的,你希望编译器告诉你。
  • 设置渲染提示之前图纸。否则提示将不会对绘图产生影响。
  • 避免给你的类名称与核心Java类名称冲突,如Frame。这可能会混淆他人和你未来的自我。

例如,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.*; 

public class MyGrafika extends JComponent { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = PREF_W; 
    private static final Color OVAL_COLOR = Color.RED; 
    private int ovalX = 200; 
    private int ovalY = 200; 
    private int ovalWidth = 100; 
    private int ovalHeight = 100; 

    public MyGrafika() { 
     setPreferredSize(new Dimension(PREF_W, PREF_H)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(OVAL_COLOR); 
     g2.fillOval(ovalX, ovalY, ovalWidth, ovalHeight); 
    } 

    private static void createAndShowGui() { 
     MyGrafika mainPanel = new MyGrafika(); 

     JFrame frame = new JFrame("MyGrafika"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
2

由于您使用Swing你应该重写paintComponent而不是paint,你也应该使用空布局照顾。但问题是,你应该做的框架可见以前将Grafika组件:

frame.add(grafika); 
frame.setVisible(true); 
// frame.setLayout(null); REMOVE THIS! 

如果你真的需要添加组件的框架已经取得了明显的后,那么你应该调用重新验证+重绘上框架或包含附加组件的面板:

frame.setVisible(true); 
// frame.setLayout(null); REMOVE THIS! 
frame.add(grafika); 
frame.validate(); 
frame.repaint();