在Jframe上绘图

时间:2010-01-25 19:08:16

标签: java swing

我无法在JFrame上绘制这个椭圆形。

static JFrame frame = new JFrame("New Frame");
public static void main(String[] args) {
  makeframe();
  paint(10,10,30,30);
}

//make frame
public static void makeframe(){
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JLabel emptyLabel = new JLabel("");
  emptyLabel.setPreferredSize(new Dimension(375, 300));
  frame.getContentPane().add(emptyLabel , BorderLayout.CENTER);
  frame.pack();
  frame.setVisible(true); 
}

// draw oval 
public static void paint(int x,int y,int XSIZE,int YSIZE) {
  Graphics g = frame.getGraphics();
  g.setColor(Color.red);
  g.fillOval(x, y, XSIZE, YSIZE);
  g.dispose();
}

框架显示但未绘制任何内容。我在这里做错了什么?

4 个答案:

答案 0 :(得分:8)

您创建了一个不会覆盖paint方法的静态方法。现在其他人已经指出你需要覆盖paintComponent等。但是为了快速修复你需要这样做:

public class MyFrame extends JFrame {  
   public MyFrame() {
        super("My Frame");

        // You can set the content pane of the frame to your custom class.
        setContentPane(new DrawPane());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true); 
   }

   // Create a component that you can actually draw on.
   class DrawPane extends JPanel {
        public void paintComponent(Graphics g) {
            g.fillRect(20, 20, 100, 200); // Draw on g here e.g.
        }
   }

   public static void main(String args[]){
        new MyFrame();
   }
}

但是,正如其他人指出的那样......在JFrame上绘图非常棘手。最好在JPanel上绘图。

答案 1 :(得分:1)

有几个项目浮现在脑海中:

  1. 永远不要覆盖paint(),而是改为paintComponent()
  2. 你为什么直接在JFrame上画画?为什么不扩展JComponent(或JPanel)并在其上绘制呢?它提供了更大的灵活性
  3. JLabel的目的是什么?如果它位于JFrame的顶部并覆盖整个事物,那么您的绘画将隐藏在标签后面。
  4. 绘画代码不应该依赖于paint()中传递的x,y值来确定绘图例程的起点。 paint()用于绘制组件的一部分。在画布上画出你想要的椭圆形。
  5. 此外,您没有看到JLabel,因为paint()方法负责绘制组件本身以及子组件。覆盖paint()是邪恶的=)

答案 2 :(得分:0)

你要覆盖错误的paint()方法,你应该覆盖名为 paintComponent 的方法,如下所示:

@Override 
public void paintComponent(Graphics g)

答案 3 :(得分:0)

您需要覆盖一个实际最多为您的Frame日期的存在绘制方法。在您的情况下,您刚刚创建了一个未被Frame默认调用的自定义新方法。

所以改变你的方法:

public void paint(Graphics g){

}