Java repaint()不调用paintComponent

时间:2015-06-10 22:42:17

标签: java graphics jframe jpanel 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 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");
}
}

多次打印Output1但从不打印Output2。为什么不通过重绘调用paintComponent方法?

2 个答案:

答案 0 :(得分:3)

您只有"Ouput1"打印过的 。在任何地方都没有打印"Output2"

答案 1 :(得分:1)

核心问题在#!/bin/bash set -o nounset if [ "$#" -ne 3 ] then echo "Post contents of a folder to Solr." echo echo "Usage: postFolderToSolr.sh <colletionName> </path/to/folder> <MIME>" echo exit 1 fi collection=$1 inputPath=${2%/} # remove suffix / if it exists mime=$3 for element in $inputPath"/"*; do bin/post -c $collection -type $mime $element done ...

ActionListener

当您致电public void actionPerformed(ActionEvent e){ myCanvas.updateGame(); myCanvas.render(); window.add(myCanvas); } 时,window.add必须首先删除JFrame,然后重新添加,重新验证布局并安排重新绘制,所有这些都需要时间,平均时间,你重复这个过程,设置一个框架根本无法跟上你的情况。

相反,将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,这只会让问题混乱。

请注意,Java已经有一个名为TimerFrame的类,这可能会给某些开发人员(特别是那些无法访问源代码的人)带来额外的混淆。