如何在JFrame上绘制图像

时间:2012-02-21 14:57:50

标签: java swing user-interface

我有一个存储在BufferedImage数组中的图像数组。我想在布局中的JFrame表格中显示这些图像。我该怎么办注意:buffered image数组中的图像数量是动态的

3 个答案:

答案 0 :(得分:4)

1)使用JList,您可以Icon(来自BufferedImage),Renderer默认返回JLabel/JComponent

2)所有更改(删除,重新排序,添加)必须在EDT上完成,然后更好地管理来自SwingWorkerRunnable#Thread的所有这些事件

3)将这些Objects放入DefaultListModel JList

答案 1 :(得分:1)

创建JPanel并将其布局管理器设置为GridLayout,其中包含网格中所需的行数和列数。

然后为每个BufferedImage创建一个JLabel并将其图标设置为包含BufferedImage的新IconImage。

最后按照您想要的顺序将所有JLabel添加到JPanel,并将JPanel添加到JFrame。

这是我头顶的一个例子;一些伪代码,因为我没有可以使用的图像:

JFrame frame = new JFrame("Title");

JPanel gridPanel = new JPanel();
//Layout as a grid with 4 rows and 3 columns
gridPanel.setLayout(new GridLayout(4,3)); 

//Pseudocode.
for(each BufferedImage in BufferedImageArray as img) {
    gridPanel.add(new JLabel(new ImageIcon(img));
}

frame.add(gridPanel);
//Other frame stuff you want here
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,600);
frame.setVisible(true);

答案 2 :(得分:1)

在您的问题中要解决这两个主题:绘制一些BufferedImage(使用Graphics完成)和布局图像。

你可以做自己的布局,但这可能很棘手。

要让Swing为您执行此操作,请使用已定义的布局(例如GridLayoutFlowLayout)并添加尽可能多的JPanel BufferedImage。确保您的JPanel具有固定的维度(参见setPreferredSize())。

使用Graphics/Graphics2D API完成自定义绘图。 在每个JComponent上,您可以获取基础Graphics实例来自定义渲染。在每个JPanel的graphics2D实例中绘制每个BufferedImage。

最后一个技巧是规范化图像尺寸,并且在调用Graphics.drawImage或裁剪图像时不要忘记尊重比例,如果您想要尊重纵横比(这是用户大多数时间所期望的)。