【问题标题】:Adding an image and a button onto a JPanel在 JPanel 上添加图像和按钮
【发布时间】:2017-02-24 15:30:20
【问题描述】:

我在下面有这个 JFrame:

public class TestJFrame extends JFrame {
    public RecyclingMachinesGui(String title) {
        super (title);

        Container container = getContentPane();
        container.setLayout(new FlowLayout());

        Panel r = new Panel();
        Jbutton j = new JButton("Recycle Item");
        r.add(j);
        container.add(r);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);      
        setSize(500,500);
        setVisible(true);
    }

    private class Panel extends JPanel {
        private BufferedImage image;

        public Panel() {
            try {
                image = ImageIO.read(new File("./temp.png"));
            }catch (IOException e) {
                e.getMessage().toString();
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
    }
}

在上面的代码中,当我出于某种原因运行new TestJFrame() 时,我只在Panel(我添加到我的容器中)中看到JButton j,而在面板中看不到图像。我的 Panel 中的 paintComponent 方法没有被调用吗?

我想在面板的顶部有一张图片,在底部有一个按钮。谁能解释为什么这没有发生?

【问题讨论】:

  • 图片加载了吗?如果要在顶部显示图像并在面板上显示按钮,请使用BorderLayout,将图像包裹在JLabel 中并将其添加到中心位置并将按钮添加到南位置
  • Panel 类使用边框布局?
  • 应用程序资源在部署时将成为嵌入式资源,因此明智的做法是立即开始访问它们。 embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。
  • @1290 不,contentPane之一
  • 但是我不想在面板上设置边框布局吗?所以我可以把图像放在 NORTH 上,把按钮放在 SOUTH 上?

标签: java swing


【解决方案1】:

Panel中的图片不显示, 因为Panel 没有合适的首选大小。 因此 LayoutManager (FlowLayout) 不知道哪个尺寸 给面板,并给它一个非常小的正方形的大小。 因此,实际上调用了您的 PanelpaintComponent, 但它只是在一个看不见的小区域上绘画,

您可以在 Panel 的构造函数中轻松修复它, 加载图片后立即调用setPreferredSize

image = ImageIO.read(new File("./temp.png"));
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));

【讨论】:

  • “您可以轻松修复它..” ..通过使用JLabel 来显示图像。
【解决方案2】:

我想在面板的顶部有一张图片,在底部有一个按钮。谁能解释为什么这没有发生?

好的,所以您实际上不需要自己绘制图像,JLabel 本身会做得很好,然后您只需使用BorderLayout 将标签添加到中心并将按钮添加到比如南方……

public class TestJFrame extends JFrame {
    public RecyclingMachinesGui(String title) {
        super (title);

        Container container = getContentPane();
        container.setLayout(new FlowLayout());

        JPanel r = new JPanel(new BorderLayout());
        try {
            r.add(new JLabel(new ImageIcon(ImageIO.read(new File("./temp.png")))));
        }catch (IOException e) {
            e.getMessage().toString();
        }
        Jbutton j = new JButton("Recycle Item");
        r.add(j, BorderLayout.SOUTH);
        container.add(r);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);      
        setSize(500,500);
        setVisible(true);
    }
}

您当前的方法是将按钮放在图像上方,如果您想将图像用作背景,这很好

【讨论】:

  • 这是一个基于你的 cmets 的想法,所以我不能 100% 确定它是否能满足你的总体要求,但它是实现你似乎想要做的事情的另一种方式 ;)
  • 啊,好吧,这种方式更有意义。我会用这种方法。谢谢!只是出于对我的 Panel 子类的好奇,何时调用 PaintComponent 方法?当我实例化Panel 子类时?编辑:这正是我所需要的。 :)
  • @1290 You paintComponent 直到组件在屏幕上“实现”后才会被调用,需要进行很多事情,但可以说,它需要添加到一个容器,并且该容器需要附加到可见的窗口/框架,然后才能绘制您的组件……作为简短的描述;)
猜你喜欢
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多