Java 如何使paintComponent方法显示在屏幕上

Java 如何使paintComponent方法显示在屏幕上,java,swing,jpanel,call,paintcomponent,Java,Swing,Jpanel,Call,Paintcomponent,我正在尝试让图片出现在JPanel上,以前也尝试过使用JLabels,但没有成功,所以现在我尝试使用paintComponent方法。我的代码包括创建一个带有框架的窗口,并在框架中添加一个JPanel。然后,在使用计时器调用的actionPerformed方法调用repaint中,我没有收到System.out.println方法的输出。有什么办法可以让它工作吗 public void createWindow(){ frame.add(panel); frame.addCom

我正在尝试让图片出现在JPanel上,以前也尝试过使用JLabels,但没有成功,所以现在我尝试使用paintComponent方法。我的代码包括创建一个带有框架的窗口,并在框架中添加一个JPanel。然后,在使用计时器调用的actionPerformed方法调用repaint中,我没有收到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);

    }

您的代码没有向我们显示问题,只是您没有将
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应该可以很好地工作,并且通常是更容易做到这一点的方法,尤其是在图像不需要重新调整大小的情况下。考虑向我们展示这个代码尝试。

<代码>以前尝试使用J标签,但不工作——JLabor是Swing中最简单的组件。没有理由不能将ImageIcon与JLabel一起使用。在进行自定义绘制之前,您应该先学习如何进行此操作。不要重新发明轮子!!!事实上,我在三周前向你展示了如何做到这一点:。Swing教程中也有很多例子。请在最后调用
frame.setVisible(true)
,一旦所有组件都添加到容器中,容器已经完全意识到了它的大小。因为我没有做JLabels,这是因为它不允许我调整大小或重新定位任何位置labels@CurtisFloras:布局管理器通常会为您处理这些问题,除非您也在谈论调整图像大小。@CurtisFloras,
它不允许我调整或重新定位任何标签
,我再次在您的帖子中为您提供了一个解决方案:。您不应该管理组件的位置,这是布局管理器的工作。还有其他解决办法。例如,您可以向JLabel添加一个EmptyByOrder,以确定图标在标签中的位置。componentlistener将在窗口调整大小时获取我更改了第一行的hanks,它现在可以正常工作answer@CurtisFloras:我知道ComponentListener的用途,我只是想知道为什么您的GUI有一个。通常我让我的布局经理为我做所有的工作。