我正在制作一个包含游戏面板的游戏,其中游戏循环绘制游戏。它还包含一个面板,该面板有一个按钮来启动游戏循环。游戏面板的背景只应在游戏开始时绘制一次。这是因为游戏图形不应在每次重绘时被清除。我遇到了两个问题,一个是背景没有初始绘制,另一个是启动循环的按钮被绘制在游戏面板上。
我试图将问题简化为最简单的形式,以下是我的尝试内容:
我试图将问题简化为最简单的形式,以下是我的尝试内容:
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();
}
}
运行代码后,会出现一个带有“开始”按钮的框架,但没有颜色。当按下“开始”按钮时,按钮会被绘制到另一个面板上,这不是我想要的。
谢谢。
super.paintComponent(g);
。不要犯这个错误——一定要调用该方法。 - Hovercraft Full Of Eels