簡體   English   中英

在 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 的大小來測試),但它沒有顯示在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM