0

ボタンをクリックして [ファイルの選択] ダイアログで画像ファイルを選択した後、画像を表示しようとしているときに問題が発生しました。

最初は選択した画像を で表示できたのJLabelですが、後で別ActionListenerの を作成したところ、それ以来うまくいかなくなったと思います。どの画像を選択しても、JLabel表示されません。

私はそれをデバッグし、ファイルチューザが画像をImageIconに渡し、JLabelから値を取得することを確認しましたが、とImageIconの後でも画像を表示しません。revalidate()repaint()

ここに、参考のために私のコードを添付しました。

(見栄えを良くするためにコードをトリミングしたため、役に立たない括弧が残っている可能性があります)

package com.xxx.LoyalCardManager;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.filechooser.FileFilter;

public class LoyalCardManagerMain implements ActionListener{

private JFrame frame;
private DatabaseHandler db = new DatabaseHandler();


private JLabel labelPic;

private JButton buttonPic;

private File picFile = new File("");
private BufferedImage image;


/**
 * Launch the application.
 * @throws SQLException 
 * @throws ClassNotFoundException 
 */
public static void main(String[] args) throws SQLException, ClassNotFoundException {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                LoyalCardManagerMain window = new LoyalCardManagerMain();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });


}



}

/**
 * Create the application.
 */
public LoyalCardManagerMain() {

    // Database initialisation
    initDatabase();

    // Draw GUI
    frame = new JFrame();
    frame.setBounds(100, 100, 619, 487);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    buttonPic = new JButton("Click to Choose Pic");
    buttonPic.setBounds(415, 252, 166, 29);
    frame.getContentPane().add(buttonPic);
    buttonPic.setEnabled(false);
    buttonPic.setActionCommand("ChoosePic");
    buttonPic.addActionListener(this);

    labelPic = new JLabel();
    labelPic.setBounds(415, 30, 167, 210);
    frame.getContentPane().add(labelPic);




}



public void actionPerformed(ActionEvent event) {
    String command = event.getActionCommand();

     if (command.equals("ChoosePic")) {
        //TODO Label now cannot display images.
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        chooser.setAcceptAllFileFilterUsed(false);
        chooser.setFileFilter(new FileFilter() {
            public boolean accept (File f) {
                String extension = Utils.getExtension(f);
                if(extension != null) {
                    if (extension.equals(Utils.gif) ||
                        extension.equals(Utils.jpeg) ||
                        extension.equals(Utils.jpg) ||
                        extension.equals(Utils.png) ||
                        extension.equals(Utils.tif) ||
                        extension.equals(Utils.tiff)) {
                        return true;
                    }else{
                        return false;
                    }
                }
                return false;
            }

            public String getDescription() {
                return "Image File (*.gif, *.jpeg, *.jpg, *.png, *.tif, *.tiff)";
            }

        });

        int retVal = chooser.showOpenDialog(frame);
        if (retVal == JFileChooser.APPROVE_OPTION) {
            picFile = chooser.getSelectedFile();
            try {
                image = ImageIO.read(picFile);
            } catch (IOException e) {

                e.printStackTrace();
            }

            // Calculate the pic's ratio and do re-scale

            double ratio = (double) labelPic.getWidth() / (double) labelPic.getHeight();
            // Do image scale, scaledW is the new Width, and LabelPic.getHeight is the new Height.
            int scaledW = (int) (image.getHeight() * ratio);
            image = new BufferedImage(scaledW, labelPic.getHeight(), BufferedImage.SCALE_FAST);
            ImageIcon icon = new ImageIcon(image);

            labelPic.setVisible(true);
            labelPic.setIcon(icon);
            labelPic.revalidate();
            labelPic.repaint();

        }


    }
}
}

他の同様の質問も参照しました。

JFileChooser を使用して JFrame にイメージをロードする

JLabel に画像が表示されない

JLabel に含まれる画像の更新 - 問題

外部サイト: JFIleChooser で JLabel を開くイメージ

Java チュートリアル ドキュメント ボタン、チェック ボックス、およびラジオ ボタンの使用方法

しかし、なぜ JLabel が選択した画像を表示しないのか、まだわかりません。

あなたの親切な助け仲間に感謝します!

4

2 に答える 2

1

わかりました、私は最終的にコードの何が問題なのかを理解しました:

サイズ変更に を使用する場合BufferedImage(申し訳ありませんが、私の質問では のメソッドを誤解しています)、メソッドscaleresize使用drawImageして画像を「再描画」する必要があります。そうしないと、画像が表示されません。

ここで変更を加えました:

double ratio = (double) labelPic.getWidth() / (double) labelPic.getHeight();
        // Do image scale, scaledW is the new Width, and LabelPic.getHeight is the new Height.
        int scaledW = (int) (image.getHeight() * ratio);
        image = new BufferedImage(scaledW, labelPic.getHeight(), BufferedImage.SCALE_FAST);// Edit here
        ImageIcon icon = new ImageIcon(image);

        labelPic.setVisible(true);
        labelPic.setIcon(icon);
        labelPic.revalidate();
        labelPic.repaint();

「ここで編集」マークから、次のコードを使用します。

BufferedImage imageTemp = new BufferedImage(resizedW, resizedH, BufferedImage.TYPE_INT_RGB);
            imageTemp.getGraphics().drawImage(image,0,0, scaledW, scaledH, null);
            image = imageTemp;

imageTempそして、最初に に値を渡してからに渡すことimageと、値を に直接渡すことには違いがありますimagenew BufferedImageに直接渡すと、image選択した画像ではなく純粋な黒色が表示されます。

于 2012-07-06T20:23:48.587 に答える
0

これを使用して画像を表示してみてください。

        JfileChooser getImage = new JFileChooser();
        ..........

        ImageIcon imagePath= new ImageIcon(getImage.getPath());

        JLabel imageLabel= new JLabel() {

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(imagePath.getImage(), 0, 0, width, height, null);
            }
        };
        imageLabel.setLocation(10, 40);
        imageLabel.setBorder(viewAnimalPanelBorder);
        imageLabel.setSize(200, newHeight);
        panel.add(imageLabel);

さらにサポートが必要な場合はお知らせください。

また、JFileChooserを使用せずに画像を表示してみてください。おそらく、テストのパスをハードコーディングしてください。

于 2012-07-06T12:54:52.180 に答える