当前位置: 首页 > 面试题库 >

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

卫学真
2023-03-14
问题内容
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);
        //}
    }  
}

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


问题答案:

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



 类似资料:
  • 问题内容: 我正在使用Flask-WTF: 这是我的表格: 这是控制器: 现在的问题是,如果您查看我的打印语句,它将始终打印已提交的内容,但从不打印有效的内容,并且永远不会执行validate_on_submit()。为什么? 问题答案: 您没有在HTML表单中插入CSRF字段。 添加到模板(docs)后,表单将按预期验证。 验证表单后添加,以查看出现的错误。 在验证之前将为空。在这种情况下,会出

  • 我有这份工作: 作业应该每小时运行一次。我以为问题是cronexpression。这就是为什么我把它改成上面的表达式。在我有这个表达之前: null

  • 问题内容: 我使用Spring应用程序上下文来处理Java Web应用程序。在这种情况下,我使用Quartz定义了计划作业。这些作业由.properties文件中定义的cron触发。 Spring上下文嵌入战争中,而.properties文件位于应用程序服务器(在这种情况下为Tomcat)上。 这很好,并允许根据环境(开发,集成,生产等)定义不同的克朗。 现在,在我自己的计算机上本地运行此应用程序

  • 下面是代码片段,我在其中使用了基于翻滚事件时间的窗口 不幸的是,它似乎从未执行过reduce函数。如果使用上面的代码进行窗口处理,reduce函数可以正常工作。下面是时间戳提取器的代码。30秒水印延迟仅用作测试值,但一分钟翻转窗口为m bd.longValue(),它返回秒时间戳1498658629,因为我的窗口也是以秒为单位定义的。< br >当我使用返回分钟时间戳的bd.longValue()

  • 问题内容: 我正在使用Asp.net MVC3,并尝试在服务器上做一个简单的Ajax发布,它返回部分视图并在搜索过程中更新我的项目列表。 Ajax成功调用服务器,服务器通过发送部分视图进行响应。但是部分视图始终在新页面中呈现。我发现这是因为它不知道即将到来的ajax调用,因此它呈现了一个新页面。 我的控制器代码非常简单: 但是无论如何,Request.IsAjaxRequest()始终返回fals

  • 问题内容: 我正在开发游戏,但扫描仪遇到了一个小问题。我收到了一个从未关闭过的资源泄漏扫描程序。 但是我认为我的扫描仪在没有关闭之前就可以正常工作。但是现在不是。有人可以帮我吗? 问题答案: 我假设您正在使用Java 7,因此会收到编译器警告,当您不关闭资源时,通常应在finally块中关闭扫描程序。 甚至更好:使用新的 Try with resource语句 :