Показать изображение, выбранное из JFileChooser в JPanel с заданным размером (изображение должно быть масштабировано) - PullRequest
0 голосов
/ 19 июля 2011

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

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);

    }

}

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Опять же, я нигде не вижу, где вы добавляете BackgroundPanel к картинной панели JPanel. Вам нужно будет установить макет picturePanel в BorderLayout, а затем добавить BackgroundPanel, bp к picturePanel в позиции BorderLayout.CENTER, а затем вызвать revalidate и перекрасить, как показывает camickr.

Мы также не видим код для вашего класса BackgroundPanel, даже если мы его запрашивали. Опять же, я надеюсь, что вы рисуете изображение в его методе paintComponent и используете правильную перегрузку drawImage, но пока вы покажете код, мы точно не узнаем.

0 голосов
/ 19 июля 2011
BackgroundPanel bp = new BackgroundPanel(bi); 

Вы не добавляете BackgroundPane в кадр нигде.Базовый код для динамического добавления компонентов:

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

Если вы уже добавили BackgroundPanel к фрейму, вы можете просто вызвать метод setImage () на панели.Поэтому теперь вам нужно изменить код, чтобы использовать ImageIO.read (...) для чтения изображения, после того как вы выбрали путь из средства выбора файлов.

...