使用内部框架时,主面板重新绘制不正常

时间:2013-03-29 03:46:02

标签: java swing panel frame repaint

我遇到了以下错误/问题而且我还没有能够在网上找到解决方案或者有类似问题的人的例子。我有一个主框架包含一个相同大小的面板(作为主要当你按下“Enter”时,弹出一个内部框架(在playerprite所在的顶部)充当库存,然后控件传递给它,如果你再次按“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
          }
    }

}

1 个答案:

答案 0 :(得分:3)

不要使用KeyListeners。使用Key Bindings

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

不要在弹出窗口中使用内部框架。使用JDialog。

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

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

不要使用空的catch子句。

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

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