在 Jpanel 上显示从 Jfilechooser 选择的图像
Display image chosen from Jfilechooser on Jpanel
我正在尝试制作一个 JPanel,它有一个按钮,您可以单击该按钮来上传图像。当您单击打开时,它会弹出一个带有 JFilechooser 的对话框,该对话框将文件路径名存储在 ArrayList 中。我希望选择的图像在选择后出现在 JPanel 上。我知道很多人以前问过这个问题,但我已经尝试了我能找到的所有解决方案,但我无法让图像出现。这是我单击上传按钮时执行的操作代码(AddImages 是 Jpanel):
private void pic1ActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String sname = file.getAbsolutePath();
ImageIcon icon = new ImageIcon(sname);
JLabel label = new JLabel(icon, JLabel.CENTER);
AddImages.add(label);
}
}
当我尝试上传图像时,图像被存储在 ArrayList 中(通过在我添加图像后添加一行打印 ArrayList 的大小来测试),但它没有显示在J面板。有谁知道我做错了什么?提前致谢。
编辑:这是面板的完整代码(可见)。 pic1 和 pic2 执行的操作是相同的代码,我在上面显示过:
addImagePrompt.setText("添加一些图片");
pic2.setText("add pic");
pic2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
pic2ActionPerformed(evt);
}
});
pic1.setText("add pic");
pic1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
pic1ActionPerformed(evt);
}
});
javax.swing.GroupLayout AddImagesLayout = new javax.swing.GroupLayout(AddImages);
AddImages.setLayout(AddImagesLayout);
AddImagesLayout.setHorizontalGroup(
AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(AddImagesLayout.createSequentialGroup()
.addGap(50, 50, 50)
.addGroup(AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(AddImagesLayout.createSequentialGroup()
.addComponent(pic2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(pic2name, javax.swing.GroupLayout.PREFERRED_SIZE, 376, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(pic1)
.addComponent(addImagePrompt))
.addContainerGap(161, Short.MAX_VALUE))
);
AddImagesLayout.setVerticalGroup(
AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(AddImagesLayout.createSequentialGroup()
.addGap(22, 22, 22)
.addComponent(addImagePrompt)
.addGap(18, 18, 18)
.addComponent(pic1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(pic2)
.addComponent(pic2name))
.addContainerGap(377, Short.MAX_VALUE))
);
mainPanel.add(AddImages, "card16");
将组件添加到容器后,您必须调用 revalidate()
以便其布局管理器(重新)计算子组件的位置并重新绘制它们:
JLabel label = new JLabel(icon, JLabel.CENTER);
AddImages.add(label);
AddImages.revalidate();
如果您使用同一个“AddImages”面板上传多张图片,您会看到它们都作为单独的组件添加到面板中。如果这不是您所期望的,您将需要重新考虑您的处理方式。
您在这里唯一缺少的是合适的布局管理器。
您可以在此处阅读相关内容:A Visual Guide to Layout Managers
因此,添加类似这样的内容应该可以帮助您实现您的愿望:
AddImages.setLayout(new BoxLayout(AddImages, BoxLayout.Y_AXIS));
AddImages.add(label);
AddImages.revalidate();
this.pack();
我正在尝试制作一个 JPanel,它有一个按钮,您可以单击该按钮来上传图像。当您单击打开时,它会弹出一个带有 JFilechooser 的对话框,该对话框将文件路径名存储在 ArrayList 中。我希望选择的图像在选择后出现在 JPanel 上。我知道很多人以前问过这个问题,但我已经尝试了我能找到的所有解决方案,但我无法让图像出现。这是我单击上传按钮时执行的操作代码(AddImages 是 Jpanel):
private void pic1ActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String sname = file.getAbsolutePath();
ImageIcon icon = new ImageIcon(sname);
JLabel label = new JLabel(icon, JLabel.CENTER);
AddImages.add(label);
}
}
当我尝试上传图像时,图像被存储在 ArrayList 中(通过在我添加图像后添加一行打印 ArrayList 的大小来测试),但它没有显示在J面板。有谁知道我做错了什么?提前致谢。
编辑:这是面板的完整代码(可见)。 pic1 和 pic2 执行的操作是相同的代码,我在上面显示过:
addImagePrompt.setText("添加一些图片");
pic2.setText("add pic");
pic2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
pic2ActionPerformed(evt);
}
});
pic1.setText("add pic");
pic1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
pic1ActionPerformed(evt);
}
});
javax.swing.GroupLayout AddImagesLayout = new javax.swing.GroupLayout(AddImages);
AddImages.setLayout(AddImagesLayout);
AddImagesLayout.setHorizontalGroup(
AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(AddImagesLayout.createSequentialGroup()
.addGap(50, 50, 50)
.addGroup(AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(AddImagesLayout.createSequentialGroup()
.addComponent(pic2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(pic2name, javax.swing.GroupLayout.PREFERRED_SIZE, 376, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(pic1)
.addComponent(addImagePrompt))
.addContainerGap(161, Short.MAX_VALUE))
);
AddImagesLayout.setVerticalGroup(
AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(AddImagesLayout.createSequentialGroup()
.addGap(22, 22, 22)
.addComponent(addImagePrompt)
.addGap(18, 18, 18)
.addComponent(pic1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(pic2)
.addComponent(pic2name))
.addContainerGap(377, Short.MAX_VALUE))
);
mainPanel.add(AddImages, "card16");
将组件添加到容器后,您必须调用 revalidate()
以便其布局管理器(重新)计算子组件的位置并重新绘制它们:
JLabel label = new JLabel(icon, JLabel.CENTER);
AddImages.add(label);
AddImages.revalidate();
如果您使用同一个“AddImages”面板上传多张图片,您会看到它们都作为单独的组件添加到面板中。如果这不是您所期望的,您将需要重新考虑您的处理方式。
您在这里唯一缺少的是合适的布局管理器。 您可以在此处阅读相关内容:A Visual Guide to Layout Managers
因此,添加类似这样的内容应该可以帮助您实现您的愿望:
AddImages.setLayout(new BoxLayout(AddImages, BoxLayout.Y_AXIS));
AddImages.add(label);
AddImages.revalidate();
this.pack();