提问者:小点点

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


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

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

我在寻找一些东西,我可以显示图像,并将其作为一个组件添加到JFrame。有人能解释一下这是怎么做到的吗?


共3个答案

匿名用户

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

作为一个未征求的建议,我建议你尽量避免让你的类扩展顶级窗口类,比如JFrame,因为这将极大地限制你对这个类的处理。如果需要扩展Swing组件,最好是JPanel,因为它可以放在JFrame、JDialog、JOptionPane、另一个JPanel,...几乎在你的图形用户界面的任何地方。注意,大多数时候你甚至不需要让你的类扩展一个组件。

我的要求是,我想添加一些更多的部件,如按钮开始/停止显示图像等。当我使用JFrame显示图像时,它占据了整个Jframe,我不能添加其他控件。

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

我在寻找一些东西,我可以显示图像,并将其作为一个组件添加到JFrame。有人能解释一下这是怎么做到的吗?

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

    < li >为您希望显示的每个图像制作图像图标,并保存您的图标。 < li >创建一个用于显示图像的JLabel。 < li >调用JLabel上的< code>setIcon(someIcon)来交换图像。 < li >如果您的图像需要改变大小以适合显示它的组件,那么让您的显示组件扩展JPanel,并按照Kevin Workman的回答(1对1!).

如果这些信息对您没有帮助,那么请考虑通过向我们提供更多相关的背景信息和相关代码来充实您的问题。

匿名用户

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

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);
    }
}

匿名用户

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

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