0

画像のフォルダーを JList に読み込むプログラムに取り組んでおり、JList で選択された画像が JPanel に描画されます。2 つのクラスがあります:ImageViewerPanelは、選択した画像を表示するパネルを作成します。次に、ImageViewerUIどちらが JList を描画ImageViewerPanelし、クラスに追加されImageViewerUIます。ImageViewerPanelクラスの関連コードを次に示します。

public ImageViewerPanel() {
    initComponents();
}

public void setImage(BufferedImage image) {
    this.image = image;
    repaint();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (scaled == false) {
        g.drawImage(image, 0, 0, null);
    }else if(scaled == true) {
        g.drawImage(image, 0, 0, 80, 80, null);
    }

ImageViewerUI画像でパネルを更新するクラスのコードは次のとおりです。

    ImageViewerPanel imagePanel = new ImageViewerPanel();
    BufferedImage displayedImage;
    BufferedImage originalImage;

public ImageViewerUI() {
    initComponents();
    loadListWithImageFilenames();
    updateImagePanel();
    updateThumbnailImagePanel();
}

public final void updateImagePanel() {
    try {
        String currFile = (String) ("Images/" + imageList.getSelectedValue());
        displayedImage = ImageIO.read(new File(currFile));
        imagePanel.setImage(displayedImage);
    } catch (IOException ex) {
        Logger.getLogger(ImageViewerUI.class.getName()).log(Level.SEVERE, null, ex);
    }

public final void updateThumbnailImagePanel() {
    try {
        String currFile = (String) ("Images/" + imageList.getSelectedValue());
        originalImage = ImageIO.read(new File(currFile));
        imagePanel.setScaled(true);
        imagePanel.setImage(originalImage);
        imageViewerPanel1.add(imagePanel);
        imagePanel.repaint();
    } catch (IOException ex) {
        Logger.getLogger(ImageViewerUI.class.getName()).log(Level.SEVERE, null, ex);
    }

}

私が抱えている問題は、画像がパネルに表示されていないことです。理由を知っている人はいますか?

4

1 に答える 1

1
imageViewerPanel1.add(imagePanel);
imagePanel.repaint();

可視 GUI にコンポーネントを追加する場合、コードは次のようになります。

imageViewerPanel1.add(imagePanel);
//imagePanel.repaint();
imageViewerPanel1.revalidate();
imageViewerPanel1.repaint();

すべてのコンポーネントは (0, 0) のサイズで作成されるため、ペイントするものはありません。revalidate() は、コンポーネントにサイズを与えるレイアウト マネージャーを呼び出します。

上記のように、レイアウト マネージャーがパネルの適切なサイズを決定できるように、imagePanel の getPreferredSize() メソッドをオーバーライドする必要もあります。

于 2013-04-02T16:05:34.463 に答える