簡體   English   中英

Java repaint()不調用paintComponent

[英]Java repaint() not calling paintComponent

我正在嘗試通過使用重畫來調用我的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 newFrame 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);
    Thread t = new Thread(this);
    t.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("Output1");
}

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

輸出1被多次打印,但是輸出2從不打印。 為什么repaint不調用paintComponent方法?

您只打印 "Ouput1" 在任何地方都沒有打印"Output2"

核心問題在您的ActionListener ...

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

當您調用window.addJFrame必須首先刪除myCanvas ,然后重新添加它,重新驗證布局並計划重新繪制,所有這些都需要花費時間,與此同時,您已經跳過了重復此過程,導致框架根本無法跟上您的情況。

而是添加window.add(myCanvas); 給構造函數

public void createFrame() {
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 700, 500);
    window.setFocusable(true);
    window.setFocusTraversalKeysEnabled(false);
    window.setVisible(true);
    window.add(myCanvas);
    Timer timer = new Timer(17, this);
    timer.start();
}

另外,根本不需要使用Thread來啟動Timer ,這只是使問題變得混亂。

注意Java已經擁有稱為FrameCanvas類,這可能使某些開發人員(尤其是那些無法訪問源代碼的開發人員)更加困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM