【发布时间】:2015-10-21 01:44:42
【问题描述】:
我有一个包含对象数组列表的主类,并有一个重绘单独的 JFrame 类的 Swing 计时器。尽管调用了 repaint 方法,但屏幕并未更新。
应该发生什么: 按下任意键时,两个对象的 x 位置都会更新。每半秒计时一次的摇摆计时器调用 repaint 方法。然后在更新的位置重新绘制图像。
据我所知,图像的位置正在更新,当我最小化并重新打开 JFrame 窗口时,图像已经移动。
我尝试更改计时器运行的时间间隔,将摇摆计时器移至 JFrame 类,将 repaint();在一个线程中。但是我仍然不知道为什么 repaint();没有更新屏幕。
这是我的代码草图: JFrame类
public class testingGround extends JPanel {
private Image image;
private qwq getter = new qwq();
protected Keyboard keyboard = new Keyboard(); //KeyListener, imported from Keyboard class
private JFrame frame = new JFrame(); //JFrame variable
public void createGUI(){
testingGround panel = new testingGround(); // Creating a new JPanel, for objects to be drawn on
JFrame frame = new JFrame("Game"); //Creating a new JFrame called frame
frame.setSize(600, 600); //Setting the size of the JFrame frame to be 600x600
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Setting so the frame exits on close
frame.setVisible(true);
frame.add(panel);// Adding the JPanel panel to the JFrame frame, so it's visible
frame.addKeyListener(keyboard); //Adding a KeyListener to detect users input in the JFrame frame
}
public Frame getFrame() { //Constructor class to get JFrame in other classes
return frame;
}
public void initComponents(){
ImageIcon imageIcon = new ImageIcon("C:/Users/destr/workspace/GameWIP3/bin/A2.png");
image =imageIcon.getImage();
}
protected void paintComponent (Graphics g){//Drawing
super.paintComponent(g);
initComponents();
for (int i=0;i<getter.getFListSize();i++)
{
System.out.print("paint called");
g.drawImage(image, getter.getFighter(i).getFighterX(), getter.getFighter(i).getFighterY(), null);
}
}
}
键盘类
public class Keyboard implements KeyListener {
private qwq getter = new qwq();
@Override
public void keyPressed(KeyEvent e) {
getter.getFighter(0).setFighterX(500);;
getter.getFighter(1).setFighterX(200);;
System.out.print("Updated the x value of two");
}
主类
public class qwq implements ActionListener {
private static ArrayList<Fighter> FighterList = new ArrayList<Fighter>(); // ArrayList // of // Fighters
Timer timer = new Timer(500, this);
private static testingGround GUI = new testingGround();
public qwq() {
timer.start();
}
public Fighter getFighter(int i) {
return FighterList.get(i); // To retrieve a fighter from the Array List
}
public void addFighter(Fighter i) {
FighterList.add(i); // To add a fighter to the Array list
}
public int getFListSize() {
return FighterList.size();
}
public static void main(String[] args) {
GUI.createGUI();
GUI.getFrame();
FighterList.add(new Fighter(0, 0));
FighterList.add(new Fighter(20, 50));
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == timer) {
GUI.repaint();
}
}
}
对象类
public class Fighter {
private int fighterX;
private int fighterY;
public Fighter ( int fighterX, int fighterY) {
this.setFighterX(fighterX);
this.setFighterY (fighterY);
}
public int getFighterX (){
return fighterX; //method to get x coordinate of a fighter
}
public int getFighterY (){
return fighterY;//method to get y coordinate of a fighter
}
public void setFighterX(int fighterX) {
this.fighterX = fighterX; //method to set the x coordinate of a fighter
}
public void setFighterY(int fighterY) {
this.fighterY = fighterY; //method to set the y coordinate of a fighter
}
}
【问题讨论】:
-
几乎每个类都在创建一个新实例
qwq,以及对FighterList和GUI的static引用,不可能知道谁实际引用了谁,这只是一堆紧密耦合的意大利面条代码 -
这也意味着你至少有两个
Timers 正在运行 -
在
TestingGround中,你创建了TestingGround的另一个实例,所以你Qwq的引用与实际显示在屏幕上的实例无关,同样,你创建JFrame的新实例与您通过getFrame返回的JFrame实例完全无关!