Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPanel上添加图像和按钮_Java_Swing - Fatal编程技术网

Java 在JPanel上添加图像和按钮

Java 在JPanel上添加图像和按钮,java,swing,Java,Swing,我的JFrame如下所示: public class TestJFrame extends JFrame { public RecyclingMachinesGui(String title) { super (title); Container container = getContentPane(); container.setLayout(new FlowLayout()); Panel r = new Panel

我的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);
        }
    }
}
在我的主方法中的上述代码中,当我运行
newtestjframe()
时,出于某种原因,我只在
面板
中看到
JButton j
(已添加到容器中),而在面板中看不到图像。是否未调用我的面板中的
paintComponent
方法


我想在面板的顶部有一张图片,底部有一个按钮。有人能解释为什么不发生这种情况吗?

您的
面板中的图像不显示,
因为
面板
没有合适的首选尺寸。 因此,布局管理器(FlowLayout
)不知道大小 给面板,给它一个非常小的正方形大小。 因此,您的
面板
paintComponent
实际上被调用, 但它只是在一个看不见的小区域上作画

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

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

面板中的图像不显示,
因为
面板
没有合适的首选尺寸。 因此,布局管理器(FlowLayout
)不知道大小 给面板,给它一个非常小的正方形大小。 因此,您的
面板
paintComponent
实际上被调用, 但它只是在一个看不见的小区域上作画

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

image = ImageIO.read(new File("./temp.png"));
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
我想在面板的顶部有一张图片,底部有一个按钮。有人能解释为什么没有发生这种情况吗

好的,所以你真的不需要自己绘制图像,一个
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);
    }
}
您当前的方法是将按钮放置在图像上,如果您想将图像用作背景,这一点非常好

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

好的,所以你真的不需要自己绘制图像,一个
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);
    }
}

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

图像是否已加载?如果要在顶部显示图像并在面板上显示按钮,请使用
边框布局
,将图像包装在
JLabel
中并将其添加到中间位置,然后将按钮添加到南部位置使用
面板
类的边框布局?部署时,应用程序资源将成为嵌入式资源,因此,明智的做法是,现在就开始访问它们,就好像它们是。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。@1290否,
contentPane
中的一个,但我不想在面板上使用borderlayout吗?所以我可以把图像放在北面,把按钮放在南面?图像已经加载了吗?如果要在顶部显示图像并在面板上显示按钮,请使用
边框布局
,将图像包装在
JLabel
中并将其添加到中间位置,然后将按钮添加到南部位置使用
面板
类的边框布局?部署时,应用程序资源将成为嵌入式资源,因此,明智的做法是,现在就开始访问它们,就好像它们是。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。@1290否,
contentPane
中的一个,但我不想在面板上使用borderlayout吗?因此,我可以将图像放在北面,将按钮放在南面,“您可以轻松地修复…”。通过使用
JLabel
来显示图像。“您可以轻松地修复…”。通过使用
JLabel
来显示图像。这是一个基于您的评论的想法,因此我不能100%确定它是否符合您的总体要求,但这是实现你似乎想要做的事情的另一种方式;)啊,好吧,这样更有意义。我将采用这种方法。非常感谢。只是出于好奇,在我的
面板
子类中,PaintComponent方法究竟是何时调用的?当我实例化
面板
子类时?编辑:这正是我需要的。:)@1290在屏幕上“实现”组件之前,不会调用您的
paintComponent
,需要进行许多操作,但只需说,它需要添加到容器中,并且在绘制组件之前,容器需要连接到可见的窗口/框架上。。。作为简短的描述;)这是一个基于您的评论的想法,所以我不能100%确定它是否能满足您的总体要求,但这是实现您似乎想做的事情的另一种方式;)啊,好吧,这样更有意义。我将采用这种方法。非常感谢。只是出于好奇,在我的
面板
子类中,PaintComponent方法究竟是何时调用的?当我实例化
面板
子类时?编辑:这正是我需要的。:)@1290在屏幕上“实现”组件之前,不会调用您的
paintComponent
,需要进行许多操作,但只需说,它需要添加到容器中,并且在绘制组件之前,容器需要连接到可见的窗口/框架上。。。作为简短的描述;)