繁体   English   中英

paintComponent方法未被重绘调用

[英]paintComponent method not being called by repaint

我正在尝试通过使用重画来调用我的paintComponent方法,但从未调用过它。 这是我的第一堂课:

public class start
{
    public static void main(String[] args){
        Frame f = new Frame();
        f.createFrame();
    }
}  

这是我希望调用paintComponent方法的类,但是发生的只是一个空白框:

import javax.swing.JButton;
import javax.swing.JComponent;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.image.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.Timer;

public class Frame implements Runnable,ActionListener
{
JFrame window = new JFrame("Frame");
int i = 0;
Canvas myCanvas = new Canvas();
public void createFrame(){
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 700, 500);
    window.setFocusable(true);
    window.setFocusTraversalKeysEnabled(false);
    window.setVisible(true);
    (new Thread(new Frame())).start();
}

public void run(){
    Timer timer = new Timer (17,this);
    timer.start();
}

public void actionPerformed(ActionEvent e){
    myCanvas.updateGame();
    myCanvas.render();
    window.add(myCanvas);
}
}

class Canvas extends JPanel{
int x = 10;
int y = 10;
public void updateGame(){
    x++;
}

public void render(){
    repaint();
    System.out.println("repaint");
}

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g.drawString("hi",x,y);
    System.out.println("paint");
}

}

重绘被多次调用,但从不调用重绘。 为什么repaint不调用paintComponent方法?

我在下面的行中注释了以下内容,而不是创建新框架,而是传递了现有框架:

public void createFrame(){
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 700, 500);
    window.setFocusable(true);
    window.setFocusTraversalKeysEnabled(false);
    window.setVisible(true);
    (new Thread(new Frame())).start(); <--- instead of creating a new frame, pass in the existing frame
}

您还应该真正考虑以下改进:

1)不要将您的班级命名为Frame ,因为它与Frame冲突

2)移动createFrame的主体以及以下三行:

JFrame window = new JFrame("Frame");
int i = 0;
Canvas myCanvas = new Canvas();

进入构造函数,并将这些局部变量(例如Canvas放入成员字段中。

3)从构造函数中删除创建线程的最后一行,并将其公开为方法(例如“ startAnimation”),并在创建对象后调用它。

编辑:

尝试这个:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

    public class Frame implements Runnable, ActionListener
    {
        final JFrame window;
        final Canvas myCanvas;

        public Frame(){
            this.window = new JFrame("Frame");
            this.myCanvas = new Canvas();
            this.window.add(this.myCanvas);
            this.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.window.setBounds(30, 30, 700, 500);
            this.window.setFocusable(true);
            this.window.setFocusTraversalKeysEnabled(false);
            this.window.setVisible(true);
        }

        public void startApp() {
            final Thread t = new Thread(this);
            t.start();
        }

        public void run(){
            final Timer timer = new Timer (1000,this);
            timer.start();
        }

        public void actionPerformed(ActionEvent e){
            myCanvas.updateGame();
            window.repaint();
        }

        public static void main(String[] args) {
            final Frame f = new Frame();
            f.startApp();
        }
    }

    class Canvas extends JPanel {
        int x = 10;
        int y = 10;
        public void updateGame() {
            x++;
        }

        @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g.drawString("hi", this.x, this.y);
            System.out.println("paint");
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM