java - 面板/按钮和重新绘制令人头痛

标签 java swing repaint

作为学校的类(class)作业,我们必须提出一个自定义项目,我选择了一个原本打算在 ActionScript 上编写的游戏创意,但决定在 Java 上插入它。最初进展顺利,游戏代码正常运行, Sprite 动画处理得很好,一切都在游戏循环中维护。直到我开始尝试向其中添加按钮和标签等组件。

目前我的游戏的结构是这样的( GameSystem[处理循环和重绘] -- GameMenu [带有开始游戏的简单介绍屏幕] <---之间交换 ---> GameContainer [保存有关游戏的信息] )

我的游戏系统内的循环更新所有必要的对象,重新绘制,然后告诉所有对象在之后重新绘制。

游戏系统:

/**/for(int i = 0; i < UpdateList.size();i++){
/**/UpdateList.get(i).Update(delta * 1.1); // tell list the element is an object that extends an interface      
/**/}
/**/Game.repaint();

/**/@Override
/**/public void paint(Graphics g) {
/**/super.paint(g);
/**/Graphics2D g2d = (Graphics2D) g;
/**/g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
/**/        RenderingHints.VALUE_ANTIALIAS_ON);
/**/for(int i = 0; i < UpdateList.size();i++){
/**/UpdateList.get(i).paint(g2d); // tell list the element is an object that extends an interface       
/**/}
/**/}

这就是它开始变得不确定的地方,因为游戏系统每次循环都会重新绘制它自己,清除以前的内容的框架,我在游戏系统内创建的游戏菜单中添加的按钮会被清除,并且仅在以下情况下短暂重新出现:将鼠标悬停在它们上。

游戏菜单:

    //////////////////
    // Start Button //
    //////////////////
    Buttons = new JPanel();     
    Buttons.add(Start_game = new JButton("Start Game"));
    this.add(Buttons);
    Start_game.addActionListener(new Load());
    /**/}
    ///////////////////

    //////////////////
    //Paint sprite //
    //////////////////
    @Override
    /**/public void paintComponent(Graphics g) {
    /**///super.paintComponent(g);
    /**/Buttons.paintComponents(g);
    /**/}
    ////////////////////////////////////

此时,我已经尝试了绘制、绘制组件、revalidate() 以及我从其他帖子中看到的各种其他东西,但没有一个有帮助。让按钮显示可见的唯一方法是删除游戏循环中对重绘的调用。然而,这会影响游戏,因为没有任何对象被重新绘制。

TL DR:如何处理更新列表中的各种对象的重绘以及刷新游戏系统面板而不使任何组件(例如按钮)消失?抱歉,如果这是一个新手问题,但这是我第一次使用 Java,因为我想从 ActionScript 向外扩展,如果需要更多信息,我很乐意添加到帖子中,谢谢您的帮助。

最佳答案

问题在于您尝试以不同于游戏绘制的方式处理按钮的绘制。

Game System
{
    paint loop
    {
        painting Game
    }
}

Components //managing the painting itself through paintComponent, trying to run at same time as Game System.
{
    paintComponent
}

所以实际上,您想要将其中一个切换到另一个。您可以在 GameSystem 中使用 paintComponent() 而不是 paint(),它会为您管理图形的处理和重新绘制(如果已经扩展了 jComponent)...

或者您需要像游戏中那样开始管理按钮的绘制,而不是依赖 paintComponent()

关于java - 面板/按钮和重新绘制令人头痛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20572378/

相关文章:

java - Aspectj ltw aop.xml

java - 准备好的语句,字符串卡在引号中

java - 为什么 JFrame 不显示输出?

java - 尝试重新绘制 jpanel

java - Repaint() 方法不会重新绘制需要的内容

java - 图形拱形不准确

java - 在集合之间复制顺序

swing - 更改 Scala Swing 组合框项目

Java:jpopupmenu 中的子菜单出现分隔符和快捷键?

java - 为什么我调用 repaint() 时没有绘制任何东西?