JfileChooser не будет отображать изображение, выбранное внутри Jpanel - PullRequest
0 голосов
/ 18 июля 2011

Мне не повезло получить изображение для отображения в Jpanel при выборе с помощью JFileChooser Java. Я также хочу, чтобы размер выбранного изображения автоматически изменялся и соответствовал заданному размеру моего Jpanel?

Вот код, который я написал до сих пор. JfileChooser отображается в новом JFrame, и я также хочу закрыть этот Jframe, когда изображение успешно загружено и доступно для просмотра в Jpanel.

Вот кнопка «Upload», которая должна открыть JFileChooser, разрешить выбор файла и затем загрузить изображение (чтобы изменить его размер, НУЖНО ПОМОЧЬ, КАК АВТОМАТИЧЕСКИ ИЗМЕНИТЬ ИЗОБРАЖЕНИЕ ИЗОБРАЖЕНИЯ), затем закрыть «рамку» Jframe, когда изображение такое шоу в Jpanel "PicturePanel"?

РЕДАКТИРОВАТЬ: ДОБАВЛЕНО ТО, что я пытаюсь сделать.

Я хочу, чтобы после нажатия кнопки «загрузить» показывалось изображение соответствующего размера (ДОЛЖНО УСТАНОВИТЬ JPANEl «Панель изображений») Отображать изображение на панели с черной рамкой.

import classes.BackgroundPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Test   {
public static void main(String[] args) {
    final JFileChooser chooser = new JFileChooser();
    JButton button = new JButton();
    button.setText("Upload");
    JFrame frame = new JFrame("My Frame");
    final JFrame imageFrame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JFileChooser fc = new JFileChooser();
    final Test_Image t = new Test_Image();
    JPanel panel = new JPanel();
    JPanel picturePanel = new JPanel();
 //  chooser.showOpenDialog(null);
      Dimension d = new Dimension(1261, 765);
      Dimension d2 = new Dimension(1300, 900);
      picturePanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
      panel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
      Dimension d3 = new Dimension(343, 247);
      picturePanel.setSize(d3);
        //picturePanel.setSize(d);
      panel.add(button);
      panel.setSize(d3);


    //panel.setVisible(true);
   //panel.add(picturePanel);

   button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            if(chooser.showOpenDialog(imageFrame) == JFileChooser.APPROVE_OPTION) {

                try {
                    Image bi = ImageIO.read(
                    chooser.getSelectedFile());
                    BackgroundPanel bp = new BackgroundPanel(bi);
                    if (bi != null)
                    bp.setImage(bi);
                    else
                    JOptionPane.showMessageDialog(imageFrame,
                    "File is not an image!");
                    } catch (IOException ioe) {
                    JOptionPane.showMessageDialog(imageFrame,
                    "Error Reading File!");
                 }                
            }                              

        }
    });      


  frame.setSize(d2);
  frame.add(picturePanel).setLocation(100, 100);
  frame.add(panel);
  frame.setVisible(true);

 }

}

1 Ответ

4 голосов
/ 18 июля 2011

При динамическом удалении / добавлении компонентов базовый код должен быть:

panel.add(...);
panel.revalidate();
panel.repaint();

Не знаю, в этом ли проблема, потому что вы не опубликовали SSCCE . Отправьте правильный SSCCE, если вам нужна дополнительная помощь.

НУЖНА ПОМОЩЬ, КАК ПОЛУЧИТЬ ИЗОБРАЖЕНИЕ АВТОМАТИЧЕСКИ ИЗМЕНЕНО),

Тогда вы не можете использовать JLabel. Вам нужно сделать пользовательское рисование и использовать метод Graphics.drawImage (....).

Вы можете взглянуть на фоновую панель , которая позволяет рисовать масштабированное или мозаичное изображение (среди прочего).

...