java - PaintComponent 没有被 JPanel 调用

标签 java swing paintcomponent imageicon

当我运行此代码时,PaintComponent 永远不会被调用,因为“painted”消息永远不会被打印,我不知道为什么?有人可以帮忙吗?

public class DisplayManager extends JPanel {

public static final int WIDTH = 700, HEIGHT = 900;

public Bottle bottle1 = new Bottle("res/bottleimage.png");
public Slider slider1 = new Slider();

public void initDisplay()
{
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(new Dimension(WIDTH, HEIGHT));

    frame.add(panel);

    frame.setVisible(true);
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    bottle1.imageIcon.paintIcon(this, g, 50, 50);
    System.out.println("painted");
}
}

最佳答案

基本代码存在几个问题:

  1. 正如已经提到的,您需要将 DisplayManager 类的实例添加到框架或面板。

  2. 当您进行自定义绘制时,您需要重写组件的 getPreferredSize() 方法以返回所需的尺寸。目前组件的首选大小是 (0, 0)。

将 DisplayManager 添加到框架的建议仅有效,因为默认布局管理器是 BorderLayout 并且默认情况下添加到布局的 CENTER 这意味着它获取框架中的所有可用空间。

但是如果您使用:

frame.add(this, BorderLayout.PAGE_START);

您不会看到组件大小,它的大小为 (0, 0);

关于java - PaintComponent 没有被 JPanel 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40685729/

相关文章:

java - 如何通过为eclipse 提供一个html 文件来在eclipse 中启动applet?

java - 如何设置 Spark 执行器的数量?

Java 图形用户界面 : Inputs in textfields change value in other textfield

java - 如何从另一个类 java 访问 JTable

java - 更新框架或重新验证/重绘面板

Java AWT/Swing 何时使用 repaint() 方法?

java - 为什么这个 JComponent 绘制不正确?

java - 如果使用 @Autowired + @Qualifier 注入(inject),如何避免在重构过程中更改 bean 名称

java - org.openqa.selenium.NoSuchElementException : no such element: Unable to locate element error using Selenium through Java

java - 我既没有看到按钮上的标签,也没有看到它被涂成绿色。这是为什么 ?