paintComponent()永远不会在JFrame上执行

时间:2011-11-10 09:10:22

标签: java swing

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.*;
import java.util.*;

public class test1 extends JFrame implements MouseListener  {
    private JPanel JP = new JPanel();

    public test1() {
        JP.setBorder(BorderFactory.createLineBorder(Color.black)); 
        JP.addMouseListener(this);
        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); 
        this.add(JP);
        this.pack();
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
              public void run() {
                    test1 frame = new test1();
                    frame.setSize(400,400);
                    frame.setVisible(true);
              }
        });
    }

    public void mouseClicked(MouseEvent e) {
        //drawCircle(e.getX(), e.getY());
        //repaint();
        ballball ball;
        ball = new ballball();
        //ball.paintComponent(Graphics g);
        System.out.println("ballball");

    }

    public void mouseExited(MouseEvent e) {

    }

    public void mousePressed(MouseEvent e) {
        //this.mouseX=e.getX();
        //this.mouseY=e.getY();
    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }    
}

class ballball extends test1 implements Runnable {

    private int squareX = 50;
    private int squareY = 50;
    private int squareW = 100;
    private int squareH = 100;
    public boolean draw;

    private Vector<Object> v = new Vector<Object>();

    public ballball() {

        /*addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent e) {
                draw = true;
                //Thread thread1 = new Thread(this.moveSquare(50, 50));
                repaint();
                //moveSquare(e.getX(),e.getY());
            }
        });*/


        /*addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                moveSquare(e.getX(),e.getY());
            }
        });*/
        System.out.println("ball created");
        this.repaint();

    }

    public void run() {

    }

    private void moveSquare(int x, int y) {
        int OFFSET = 1;
        if ((squareX!=x) || (squareY!=y)) {
            repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
            squareX=x;
            squareY=y;
            repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
        } 
    }

    public void paint(Graphics g) {
        g.drawString("abcasdfasffasfas", 10, 10);
    }

    //@Override
    public void paintComponent(Graphics g) {
        //if (draw) {
        // existing code
        System.out.println("paint");
        //super.paintComponent(g);       

        //g.drawString("This is my custom Panel!",10,20);
        //g.setColor(Color.RED);
        //g.fillRect(squareX,squareY,squareW,squareH);
        //g.setColor(Color.BLACK);
        //g.drawRect(squareX,squareY,squareW,squareH);
        Shape circle = new Ellipse2D.Float(squareX,squareY,100f,100f);
        Graphics2D ga = (Graphics2D)g;
        ga.draw(circle);
        //}
    }  
}

该程序的目的是单击创建圆,球类扩展test1,当test1检测到鼠标单击时,创建球球对象。但是永远不会执行paint / paintComponent方法。在我的程序结构中,是否可以将圆圈绘制到超类JPanel?

1 个答案:

答案 0 :(得分:12)

JFrame不是JComponent,它没有您可以覆盖的paintComponent方法。相反,您可以扩展JPanel并将其添加到框架中。