-1

我正在 JPanel 的图形上下文中绘制图像。但是,当我按 S 时,图像不会从图形上下文中删除。我确定我的 keyListener 正在工作。

如果我正在处理图形上下文,图形上下文中的内容不应该消失吗?

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();
        }

    }
4

1 回答 1

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- 这会降低性能。在启动时从方法加载图像
  • 在开发 Swing 应用程序时,使用Key Bindings而不是KeyListeners. 后者KeyEvents需要专注才能工作。无论焦点如何,都Key Bindings使用哪个工作。KeyStrokes
于 2013-05-31T15:29:30.043 回答