使用JFrame以外的组件在Java GUI中显示图像

时间:2014-06-30 18:45:59

标签: java swing user-interface awt

我是Java GUI编程的新手。我正在开发一个应用程序,我需要在UI上显示图像,以及其他一些按钮/控件。我有一段使用JFrame的代码。

我的要求是我想添加更多小部件,例如按钮来开始/停止显示图像等。当我使用Jframe显示图像时,它占用整个JFrame,我无法添加其他控件。

我正在寻找可以显示图像并将其作为组件添加到JFrame中的内容。有人可以解释一下如何做到这一点吗?

3 个答案:

答案 0 :(得分:7)

  

我是Java GUI编程的新手。我正在开发一个应用程序,我需要在UI上显示图像,以及其他一些按钮/控件。我有一段使用JFrame的代码。

作为一个未被征求意见的一般建议,我建议您尽量避免让您的类扩展顶级窗口类(如JFrame),因为这将极大地限制您可以对该类执行的操作。如果你需要扩展它是一个JPanel的Swing组件,那就更好了,因为它可以放在JFrame,JDialog,JOptionPane,另一个JPanel中......几乎在你的GUI中的任何地方。请注意,大多数情况下,您甚至不需要让您的类扩展组件。

  

我的要求是我想添加更多小部件,例如按钮来开始/停止显示图像等。当我使用Jframe显示图像时,它占用整个JFrame,我无法添加其他控件。 / p>

这有点令人困惑,因为JFrame本身没有显示图像的机制。

  

我正在寻找可以显示图像并将其作为组件添加到JFrame中的内容。有人可以解释一下如何做到这一点吗?

您的要求有点模糊,但请考虑:

  • 为您要显示的每个图片制作ImageIcons,并保存图标。
  • 创建一个用于显示图像的JLabel。
  • 在JLabel上调用setIcon(someIcon)来交换图像。
  • 如果您的图片需要更改大小以适合显示它的组件,那么让您的显示组件扩展JPanel,并按照Kevin Workman的回答(JP + 1)的方式在JPanel的paintComponent(Graphics g)方法中显示您的图像!)。

如果此信息对您没有帮助,请通过向我们提供更相关的背景信息和相关代码,考虑更多地解答您的问题。

答案 1 :(得分:4)

一种简单的方法是在JLabel中显示图像。

图像浏览器

Many (OK 3) images

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.Random;

public class ImageViewer {

    JPanel gui;
    /** Displays the image. */
    JLabel imageCanvas;

    /** Set the image as icon of the image canvas (display it). */
    public void setImage(Image image) {
        imageCanvas.setIcon(new ImageIcon(image));
    }

    public void initComponents() {
        if (gui==null) { 
            gui = new JPanel(new BorderLayout());
            gui.setBorder(new EmptyBorder(5,5,5,5));
            imageCanvas = new JLabel();

            JPanel imageCenter = new JPanel(new GridBagLayout());
            imageCenter.add(imageCanvas);
            JScrollPane imageScroll = new JScrollPane(imageCenter);
            imageScroll.setPreferredSize(new Dimension(300,100));
            gui.add(imageScroll, BorderLayout.CENTER);
        }
    }

    public Container getGui() {
        initComponents();
        return gui;
    }

    public static Image getRandomImage(Random random) {
        int w = 100 + random.nextInt(400);
        int h = 50 + random.nextInt(200);
        BufferedImage bi = new BufferedImage(
                w,h,BufferedImage.TYPE_INT_RGB);

        return bi;
    }

    public static void main(String[] args) throws Exception {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("Image Viewer");
                // TODO Fix kludge to kill the Timer
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final ImageViewer viewer = new ImageViewer();
                f.setContentPane(viewer.getGui());

                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);

                ActionListener animate = new ActionListener() {

                    Random random = new Random();

                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        viewer.setImage(getRandomImage(random));
                    }
                };
                Timer timer = new Timer(1500,animate);
                timer.start();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

答案 2 :(得分:3)

有几个组件支持显示图标。其中一个是JLabel:http://docs.oracle.com/javase/tutorial/uiswing/components/label.html

另一种选择是扩展JPanel并覆盖paintComponent()方法以显示您想要的任何内容,包括图像:http://docs.oracle.com/javase/tutorial/uiswing/painting/