我在JPanel的图形上下文中绘制图像。但是,当我按下S时,图像不会从图形上下文中删除。我知道我的keyListeners正在工作。
如果我处理图形上下文,图形上下文中的内容是否应该消失?
public class MainMenu extends JPanel implements KeyListener {
private JFrame frame;
private int width = 660;
private int height = 500;
private Image image;
private boolean removeImage = false;
public MainMenu()
{
frame = new JFrame();
frame.setResizable(false);
frame.setTitle("Menu Test");
setBackground(Color.BLACK);
frame.setSize(width,height);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// add main menu to the frame
frame.add(this);
// let the frame know about keyevents from this class
frame.addKeyListener(this);
}
public void setup()
{
frame.setVisible(true);
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_S)
{
removeImage = true;
}
repaint();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
try {
image = ImageIO.read(new File("Game/menuScreen.PNG"));
g.drawImage(image, 0, 0, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(removeImage)
{
g.dispose();
}
}
答案 0 :(得分:2)
调用Graphics#dispose
不会删除JPanel
if (removeImage) {
g.dispose();
}
而是使用boolean
标志来指示是否应该绘制图像
if (showImage) {
g.drawImage(image, 0, 0, this);
}
将标记更新为false
并调用repaint
以有效“清除”之前的所有图像。
showImage = false;
repaint();
注意:
dispose
中的Graphics
个对象调用paintComponents
。这仅适用于自定义Graphics
引用。paintComponent
加载图片 - 这会降低性能。从启动时的方法加载图像KeyListeners
。后者使用需要重点工作的KeyEvents
。 Key Bindings
使用KeyStrokes
,无论重点如何,都可以正常工作。