面板/按钮和重新涂抹头痛

时间:2013-12-13 17:23:08

标签: java swing repaint

作为学校的课程作品,我们必须提出一个自定义项目,我选择了一个游戏理念,我原本打算在动作脚本上写,但决定在Java上推动它。这最初进展顺利,游戏代码正常工作,精灵动画处理得很好,一切都在游戏循环中维护。直到我开始尝试添加按钮和标签等组件。

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

我在GameSystem中的循环更新所有必需的对象,重新绘制,然后告诉所有对象重绘后。

游戏系统:

/**/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);
    /**/}
    ////////////////////////////////////

此时我尝试过绘画,绘画组件,重新验证()以及其他一些我从其他帖子中发现的其他内容,但没有人帮助过。我让按钮显示的唯一方法是,如果我在游戏循环中删除重绘的调用。然而,这会影响游戏,因为没有任何对象被重新粉刷。

TL DR:我如何处理重新绘制更新列表中的各种对象并刷新Gamesystem面板而不使任何组件这样的按钮消失?很抱歉,如果这是一个noobish问题,但这是我第一次使用Java,因为我想从actionscript向外扩展,如果需要更多信息,我很乐意添加到帖子中,谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

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

Game System
{
    paint loop
    {
        painting Game
    }
}

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

因此,实际上,您希望将一个切换到另一个。您可以使用paintComponent()中的GameSystem代替paint()paintComponent()管理处理图形并重新绘制(如果它已经扩展了jComponent)......

或者你需要开始管理按钮的绘画,就像你为游戏做的那样,而不是依靠{{1}}