[英]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 的大小來測試),但它沒有顯示在 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");
將組件添加到容器后,您必須調用revalidate()
以便其布局管理器(重新)計算子組件的位置並重新繪制它們:
JLabel label = new JLabel(icon, JLabel.CENTER);
AddImages.add(label);
AddImages.revalidate();
如果您使用相同的“AddImages”面板上傳多張圖片,您會看到它們都作為單獨的組件添加到面板中。 如果這不是您所期望的,您將需要重新考慮如何處理它。
您在這里唯一缺少的是一個合適的布局管理器。 您可以在這里閱讀相關內容: 布局管理器視覺指南
因此,例如添加這樣的內容應該可以幫助您實現您的願望:
AddImages.setLayout(new BoxLayout(AddImages, BoxLayout.Y_AXIS));
AddImages.add(label);
AddImages.revalidate();
this.pack();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.