【问题标题】:How to get paintComponent method to appear on screen如何让paintComponent方法出现在屏幕上
【发布时间】:2013-10-11 16:34:42
【问题描述】:

我正在尝试让图片出现在 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);

    }

【问题讨论】:

  • have previously tried using JLabels but that didn't work - JLabel 是 Swing 中最简单的组件。没有理由不能将 ImageIcon 与 JLabel 一起使用。在进行自定义绘画之前,您应该先学习如何做到这一点。不要重新发明轮子!!!事实上,我在 3 周前向您展示了如何做到这一点:stackoverflow.com/a/18927663/131872。 Swing 教程也有大量示例。
  • 并且请在最后拨打frame.setVisible(true)之类的电话,一旦所有组件都添加到容器中,并且容器已经完全实现了它的大小。
  • 我没有做 JLabels 的原因是因为它不允许我调整大小或重新定位任何标签
  • @CurtisFloras:布局管理器通常会为您处理这个问题,除非您还讨论调整图像大小。
  • @CurtisFloras, it wouldn't let me resize or relocate any labels 我再次在您的帖子中为您提供了解决方案:stackoverflow.com/q/19170601/131872。您不应该管理组件的位置,这是布局管理器的工作。还有其他解决方案。例如,您可以将 EmptyBorder 添加到 JLabel 以确定图标在标签中的位置。

标签: java swing jpanel call paintcomponent


【解决方案1】:

除了您没有将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 应该可以正常工作,而且通常是更简单的方法,尤其是在不需要重新调整图像大小的情况下。考虑向我们展示此代码尝试。

【讨论】:

  • 组件监听器是在窗口调整大小时获取的
  • 谢谢我改变了第一行,现在它被选为正确答案
  • @CurtisFloras:我知道 ComponentListener 的用途,我只是想知道为什么你的 GUI 有一个。通常我让我的布局管理器为我完成所有工作。
猜你喜欢
  • 2015-05-31
  • 2023-03-22
  • 2022-01-05
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多