【发布时间】:2020-03-13 08:58:54
【问题描述】:
我正在制作一个包含游戏面板的游戏,游戏循环在其中绘制游戏。它还包含一个面板,其中包含一个用于启动游戏循环的按钮。游戏面板的背景只能在游戏开始时绘制一次。这是因为游戏图形不应该在每次重绘时被删除。我遇到了两个问题,最初没有绘制背景,并且开始循环的按钮被绘制在游戏面板上。
我试图将问题简化为最简单的形式,这就是我所拥有的:
public class Graphics_Trouble extends JFrame
{
private MainPanel mainPanel = new MainPanel();
private JPanel menuPanel = new JPanel();
private JButton start = new JButton("Start");
public Graphics_Trouble()
{
start.addActionListener(new java.awt.event.ActionListener()
{
@Override
public void actionPerformed(java.awt.event.ActionEvent evt)
{
StartActionPerformed(evt);
}
});
menuPanel.add(start);
add(menuPanel, BorderLayout.PAGE_START);
add(mainPanel, BorderLayout.CENTER);
pack();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void StartActionPerformed(java.awt.event.ActionEvent evt)
{
mainPanel.start();
}
public static void main(String[] args)
{
java.awt.EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
new Graphics_Trouble().setVisible(true);
}
});
}
}
class MainPanel extends JPanel
{
private Timer timer;
private boolean first = true;
public MainPanel()
{
timer = new Timer(30, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timedAction();
}
});
}
@Override
public Dimension getPreferredSize()
{
Dimension size = new Dimension(300, 400);
return size;
}
@Override
public void paintComponent(Graphics g)
{
if(first)
{
g.setColor(Color.black);
g.fillRect(0, 0, 300, 400);
}
first = false;
}
public void timedAction()
{
repaint();
}
public void start()
{
timer.start();
}
}
运行时,这会产生带有“开始”按钮但没有颜色的框架,当按下“开始”按钮时,按钮会被绘制到另一个面板上,这是我不打算的。
谢谢
【问题讨论】:
-
请包含所有导入,以便更轻松地将代码复制并粘贴到我们的编译器中以查看代码结果。
-
"...the button to start the loop gets drawn on the game panel"-- 立即向我建议您没有在您的paintComponent 覆盖中调用super.paintComponent(g);。不要犯这个错误——调用方法。 -
另外,我不建议你只画一次背景。尝试不断地在最后一帧上绘画;本质上,每次你都在所有东西上画一个背景,然后画各个部分等等。