Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
211 views
in Technique[技术] by (71.8m points)

java - paintComponent () never executes on a JFrame

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);
        //}
    }  
}

The aim of the program is to click to create the circle, the ballball class extends the test1, when test1 detect the mouse click, the ballball object created. But the paint/paintComponent method is never be executed. In my program structure, is it possible to paint the circle to the super class JPanel?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

JFrame is not a JComponent, it doesn't have a paintComponent method you can override. Instead you could extend a JPanel and add it to the frame.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...