1

我正在尝试让图片出现在 JPanel 上,并且之前曾尝试使用 JLabels 但这没有用,所以现在我正在尝试使用 paintComponent 方法。我的代码包括制作一个带有框架的窗口并将 JPanel 添加到框架中。然后在使用计时器调用 repaint 调用的 actionPerformed 方法中,我没有收到 System.out.println 方法的输出。有什么办法可以让这个工作吗?

public void createWindow(){

    frame.add(panel);
    frame.addComponentListener(this);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setSize(xSize, ySize);
    frame.setLocation(0, 0);

    }

@Override                 
public void paintComponent(Graphics g) {

    System.out.println("Method Called");
    super.paintComponent(g);
    g.drawString("Code has painted", 10, 100);

    }
4

1 回答 1

2

this除了您没有添加到 JFrame之外,您的代码没有向我们展示问题。对于要调用的paintComponent 方法,必须将包含该方法的对象添加到GUI,它必须是可见的。您的代码没有显示这一点。

换句话说,改变这个:

public void createWindow(){
    frame.add(panel);  // what is panel? do you override *its* paintComponent?
    frame.addComponentListener(this);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setSize(xSize, ySize);
    frame.setLocation(0, 0);
}

对此:

public void createWindow(){
    frame.add(this);  // ******  Here you go ****
    frame.addComponentListener(this);  // Not sure what this is for
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);
    // frame.setSize(xSize, ySize); // *** avoid this guy
    frame.setLocation(0, 0);
}

你还说:

我正在尝试让图片出现在 JPanel 上,并且之前尝试过使用 JLabels 但那没有用

但是使用 JLabel 应该可以正常工作,并且通常是更简单的方法,尤其是在不需要重新调整图像大小的情况下。考虑向我们展示此代码尝试。

于 2013-10-11T16:38:54.510 回答