2015-06-10 2 views
1

Я пытаюсь вызвать метод paintComponent с помощью repaint, но он никогда не вызывается. Это мой первый класс:Java 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 не вызывается перерисовкой?

+1

Похоже, у вас есть '«output1»' в обоих места ... – River

+1

Скорее всего, ваша проблема, но очень странно начинать новую тему только для создания таймера качания и планировать работу на нем. Просто создайте и запустите таймер в методе createFrame. Избавьтесь от интерфейса Thread/Runnable. – wolfcastle

+0

@ Реверс прав. Это правильный ответ. Все, что вам нужно сделать, это исправить это: – Ungeheuer

ответ

3

У вас есть только "Ouput1". В любом месте нет "Output2".

+0

Видно, как я не вижу весь код, мое «подозрение» заключается в том, что они создают несколько окон, но не отображают правильный – MadProgrammer

1

Основная проблема заключается в вашей 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 начать Timer, это просто запутывают проблему.

Учтите, что Java уже есть классы, называемые Frame и Canvas, которые могли бы внести дополнительную путаницу в некоторых разработчиков (особенно тех, кто не имеет доступа к источнику)

Смежные вопросы