0

我有以下错误/问题,我还没有在网上找到解决方案或有类似问题的人的例子。基本上我有一个包含相同大小的面板(充当主面板)的主框架和当您按“Enter”时,会弹出一个内部框架(在 playersprite 所在的顶部)充当库存,然后将控制权传递给它,如果再次按“Enter”,则库存被销毁并将控制权传回给主面板。

调用重绘函数,然后重绘角色和地图,这在大约 90% 的时间里工作。当库存被销毁时,其他 10% 或更少的时间似乎调用了重绘(并且工作),除了没有绘制它就好像它在被破坏的面板上绘制一样,因为如果我在主面板(屏幕)上添加一个调用重绘的调试按键,一切都会恢复正常。

当然,我可以在 run() 方法中的每个循环中重新绘制角色,但这太糟糕了,因为我只会在发生变化时重新绘制(即我移动了)

我删除了所有移动和其他代码,因为它们没有用,并且仍然遇到以下代码的问题。您可以将 Character 类视为一个普通绘制的正方形。任何人都知道为什么会发生这种情况?

public class main extends JFrame implements Runnable{
    private boolean gameRunning=true;
    private Character Link;
    private MainScreen theScreen;
    public final int ScreenHeight=500;
    public final int ScreenWidth=500;
    public boolean inMenu=false;
    Block ablock=new Block(200,200);
    public class Inventory extends JInternalFrame{
        public Inventory(){
            setBounds(25,25,300,300);
            setDefaultCloseOperation(HIDE_ON_CLOSE);
            setVisible(true);
            addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e){
                    int key=e.getKeyCode();
                    if(key==KeyEvent.VK_ENTER){
                    try{                                    
                        setClosed(true);
                        theScreen.requestFocusInWindow();
                        theScreen.repaint();
                        inMenu=false;
                    }                               
                    catch(Exception ex){}
                    }
            }});
        }
    }
    class MainScreen extends JPanel{
        MainScreen(){
            super();
            setIgnoreRepaint(true);
            setFocusable(true);
            setBounds(0,0,ScreenWidth,ScreenHeight);
            setVisible(true);
            setBackground(Color.white);
        }
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            Link.draw(g);
            g.drawImage(ablock.getImg(),ablock.getX(), ablock.getY(),null);
        }
    }
    main(){
        super();
        final JDesktopPane desk = new JDesktopPane();
        theScreen=new MainScreen();
        add(theScreen);
        theScreen.addKeyListener(new KeyAdapter() {
            public  void keyPressed(KeyEvent e){
                int key=e.getKeyCode();
                if(key==KeyEvent.VK_ENTER){
                    inMenu=true;
                    Inventory myInventory=new Inventory();
                    desk.add(myInventory);
                    myInventory.requestFocusInWindow();
                }
            }   
    });
        add(desk);
        try {
            UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());

            }
        catch (Exception e) {}
        setTitle("Project X");
        setResizable(false);
        Link=new Character();
        setSize(500,500);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        main Game=new main();
        new Thread(Game).start();
    }
    public void run(){
            //omitted/irrelevant only contains  a FPS count
          }
    }

}
4

1 回答 1

3

不要使用 KeyListener。使用键绑定

不要使用线程。使用 Swing Timer 制作动画,以便在 EDT 上完成更新。

不要将内部框架用于弹出窗口。使用 JDialog。

在 JPanel 而不是 JDesktopPane 上进行自定义绘制。

不要使用 setIgnoreRepaints()。用于主动渲染。

不要使用空的 catch 子句。

使用标准 Java 命名约定。类以大写字符开头,变量名不是。

不要使用 setBounds()。使用布局管理器。

于 2013-03-29T03:48:33.637 回答