java - 使用内部框架时,主面板重新喷漆无法正常工作

标签 java swing panel frame repaint

我遇到了以下错误/问题,但我尚未在网络上找到解决方案或具有类似问题的人的示例。基本上,我有一个主框架,其中包含相同大小的面板(充当主框架)当您按“Enter”键时,会弹出一个内部框架(在玩家 Sprite 所在的位置的顶部)充当库存,然后控制权将传递给它,如果您再次按“Enter”键,库存将被销毁并且控制权将被销毁传回主面板。

调用重绘函数,然后重新绘制角色和 map ,这在大约 90% 的时间内有效。另外 10% 或更少的时间,只要库存被销毁,似乎就会调用重绘(并且有效)除了没有绘制任何东西,就像它在被破坏的面板上绘制一样,因为如果我添加一个在主面板(屏幕)上调用重绘的调试按键,一切都会恢复正常。

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

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

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
          }
    }

}

最佳答案

不要使用 KeyListener。使用Key Bindings .

不要使用线程。使用 Swing 计时器来制作动画,以便更新将在 EDT 上完成。

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

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

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

不要使用空的 catch 子句。

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

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

关于java - 使用内部框架时,主面板重新喷漆无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696994/

相关文章:

wordpress - 如何在插件激活的管理面板中显示通知?

java - Android SQLite 从数据库中删除特定行

java - 需要有关验证自动完成的帮助

java - Swing 发电机

java - fireTableRowsUpdated() 在 JTable 中完成更新后不起作用

css - 如何在页面中心的许多面板中仅对齐两个面板的分组文本?

java - 水平 EditText 一次滚动一个字符

java - 将字符串转换为反向 int 数组

java - 如何使用 dart-maven-plugin 构建 dart 项目?

c# - Visual Studio 中没有父窗体的设计面板