java - 调整大小是重新绘制 JFrame 的唯一方法。重绘();似乎不起作用

标签 java swing jpanel repaint

我目前正在尝试制作我的第一个游戏,但在使 repaint() 方法正常工作时遇到问题。我已经检查了我的 keyListeners 并确认它们工作正常!我创建的船会移动,但前提是我通过拖动侧面来强制调整窗口大小。如果有人有任何提示,我将非常感激!

如果您需要更多信息,请随时询问!

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;




public class Main extends Canvas implements KeyListener{

public static Ship playerShip = new Ship(150,450,"F5S4-Recovered.png");

public int numberOfEnemies = 0;





public static void createFrame(){



   Window frame1 = new Window();

   final JPanel pane = new JPanel(){

     public void paintComponent(Graphics g){

        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, 1000, 1000);
        g.drawImage(playerShip.image, playerShip.xPos1, playerShip.yPos1, this);

    }     

  };

   frame1.add(pane);

}

public void keyTyped(KeyEvent e){System.out.println("KeyTyped");}

public void keyPressed(KeyEvent e){

    switch(e.getKeyCode())
    {
        case KeyEvent.VK_LEFT :
            playerShip.xPos1-=2;
            break;
        case KeyEvent.VK_RIGHT:
            playerShip.xPos1+=2;
            break;


    }


    repaint();

}

public void keyReleased(KeyEvent e){}

public static void main(String args[]){

     createFrame();

}   

}

窗口类-------------------------------------------------------- -------------

    import javax.swing.*;



    public class Window extends JFrame{


        public Window()
        {
            setTitle("Space Game");
            setSize(800,800);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            addKeyListener(new Main());
            setVisible(true);

        }




    }

最佳答案

repaint() 的调用正在重新绘制 Canvas 类,但绘制是在 JPanel Pane 上完成的。调整大小会导致面板自动重新绘制。因此,要解决此问题,您需要 pane.repaint(),但除非您将面板作为类成员,否则您不能这样做,这样您就可以从监听器方法访问它。目前,它的作用域位于 createFrame() 方法的本地范围内。

此外,您可能应该将监听器添加到面板中,甚至不扩展 Canvas,因为您甚至没有使用它

其他注意事项:

  • 考虑使用 Key Bindings而不是低级的 KeyListener

  • Swing 应用程序应从事件调度线程 (EDT) 运行。您只需将 main 中的代码包装在 SwingUtilities.invokeLate(..) 中即可实现此目的。查看更多Initial Threads

  • 再次,我只是添加,不要扩展 Canvas

关于java - 调整大小是重新绘制 JFrame 的唯一方法。重绘();似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531652/

相关文章:

java - Hibernate 和 jOOQ 共享事务

java - org.jdesktop.swingbinding.JTableBinding$BindingTableModel 无法转换为 javax.swing.table.DefaultTableModel

java - 单选按钮问题

java - .pack() 有什么作用?

java - 无法从 mapStruct Autowiring Mapper

java - 以相同的方式解析文件和命令行选项

java - 使用 RSA 公钥加密 AES key

java - 如何使 JXTreeTable 对其顶部元素进行排序

java - 使用平移校准坐标系统后鼠标坐标停止工作-java

java - 正确调整 JScrollPane 及其内容的大小