按下Java键后,图像将不会被处理
我在JPanel的图形背景上绘制图像。但是,当我按下S键时,图像不会从图形上下文中删除。我确信我的键盘侦听器正在工作 如果我正在处理图形上下文,那么图形上下文上的内容不应该消失吗按下Java键后,图像将不会被处理,java,graphics,paintcomponent,keyevent,Java,Graphics,Paintcomponent,Keyevent,我在JPanel的图形背景上绘制图像。但是,当我按下S键时,图像不会从图形上下文中删除。我确信我的键盘侦听器正在工作 如果我正在处理图形上下文,那么图形上下文上的内容不应该消失吗 public class MainMenu extends JPanel implements KeyListener { private JFrame frame; private int width = 660; private int height = 500; private
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();
}
}
调用Graphics#dispose
不会从JPanel
if (removeImage) {
g.dispose();
}
而是使用布尔
标志指示是否应绘制图像
if (showImage) {
g.drawImage(image, 0, 0, this);
}
将标志更新为false
并调用repaint
以有效地“清除”任何以前的图像
showImage = false;
repaint();
注:
- 对于
中的paintComponents
对象,无需调用Graphics
。这仅适用于自定义dispose
图形
参考
- 不要从
加载图像-这会降低性能。在启动时从方法加载映像paintComponent
- 在开发Swing应用程序时,使用而不是
。后者使用需要焦点才能工作的键侦听器
<代码>键绑定使用不考虑焦点的KeyEvents
击键