我正在尝试制作一个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的大小进行测试),但它不会显示在jpanel上。有人知道我做错了什么吗?提前谢谢。
编辑:下面是面板的完整代码(可见)。为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");
2条答案
按热度按时间wlsrxk511#
这里唯一缺少的就是一个合适的布局管理器。您可以在这里阅读:布局管理器的视觉指南
例如,添加这样的内容可以帮助您实现您的愿望:
lztngnrs2#
将组件添加到容器后,必须调用
revalidate()
以便其布局管理器(重新)计算子组件的位置并重新绘制它们:如果使用同一个“addimages”面板上载多个图像,您将看到它们都作为单独的组件添加到面板中。如果这不是你所期望的,你需要重新思考你如何处理这个问题。