【问题标题】:Display image in Java GUI using component other than JFrame使用 JFrame 以外的组件在 Java GUI 中显示图像
【发布时间】:2014-06-30 18:45:58
【问题描述】:
我是 Java GUI 编程的新手。我正在开发一个需要在 UI 上显示图像以及其他一些按钮/控件的应用程序。我有一段使用 JFrame 的工作代码。
我的要求是我想在哪里添加一些小部件,例如开始/停止显示图像的按钮等。当我使用Jframe显示图像时,它占据了整个JFrame,我不能添加其他控件。
我正在寻找可以显示图像并将其作为组件添加到 JFrame 的东西。有人能解释一下这是怎么做到的吗?
【问题讨论】:
标签:
java
swing
user-interface
awt
【解决方案1】:
我是 Java GUI 编程的新手。我正在开发一个需要在 UI 上显示图像以及其他一些按钮/控件的应用程序。我有一段使用 JFrame 的工作代码。
作为一个一般性的未征求意见,我建议您尽量避免让您的类扩展顶级窗口类,例如 JFrame,因为这将极大地限制您可以使用该类做什么。如果您需要扩展一个作为 JPanel 的 Swing 组件,那就更好了,因为它可以放置在 JFrame、JDialog、JOptionPane、另一个 JPanel 中……几乎在您的 GUI 中的任何位置。请注意,大多数时候您甚至不需要让您的类扩展组件。
我的要求是我想在哪里添加一些小部件,例如开始/停止显示图像的按钮等。当我使用Jframe显示图像时,它占据了整个JFrame,我无法添加其他控件。
这有点令人困惑,因为 JFrame 本身没有显示图像的机制。
我正在寻找可以显示图像并将其作为组件添加到 JFrame 的东西。有人能解释一下这是怎么做到的吗?
您的要求有点模糊,但请考虑:
- 为您希望显示的每个图像制作 ImageIcon,并保存您的图标。
- 创建一个用于显示图像的 JLabel。
- 在您的 JLabel 上调用
setIcon(someIcon) 以交换图像。
- 如果您的图像需要更改大小以适应显示它的组件,则让您的显示组件扩展 JPanel,并按照 Kevin Workman 的回答(1+!)在 JPanel 的
paintComponent(Graphics g) 方法中显示您的图像.
如果这些信息对您没有帮助,请考虑通过向我们提供更多相关背景信息和相关代码来进一步充实您的问题。
【解决方案2】:
一种简单的方法是在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);
}
}