2015-05-19 2 views
0

Я хочу добавить изображение в JPanel, JPanel находится внутри JInternalFrame, а JInternalFrame имеет родительский JDesktopPane.Добавление изображения в JPanel внутри JInternalFrame

Я попытался с другим классом добавить изображение с пути, а затем, jPanel1 = new Imagen(<String FilePath>);, класс получит путь в String в конструкторе окна, но он не работает. и я попытался настроить код из initComponents(), строки jPanel1 = javax.swing.JPanel(); и заменить эту строку на jPanel1 = new Imagen() ;, параметр, который получит конструктор, - это путь к файлу изображения, и этот метод работает нормально, но он запускается только один раз (внутри метода initComponents()), и я не могу (или не знаю), как заменить изображение из JPanel. :(

Проект начинается сначала с JDesptopPane, а затем с одного внутреннего блока (1), из этого внутреннего кадра он показывает другой JInternalFrame (2), из этого внутреннего фрейма, он показывает другой JInternalFrame (3) во внутреннем фрейме 3 , Я хочу найти с помощью кнопки, и JFileChooser, образ и путь, полученный файловым устройством, я хочу установить в качестве параметра в классе Imagen() и установить изображение в JPanel, который встроен в JInternalFrame (. 3)

EDIT 1:. Спасибо за ваши комментарии здесь код JInternalFrame (3), окно конструктора:

public AgregarContacto() { 

    JFileChooser jf = new JFileChooser(); 

    jf.setDialogTitle("Elija el archivo de Imagen"); 
    int i = jf.showOpenDialog(null); 

    if (i == JFileChooser.APPROVE_OPTION) { 

     default1 = jf.getSelectedFile().getAbsolutePath(); 
    } 
    initComponents(); 
    jPanel1= new Imagen(default1); 
    for (String llenarMese : p.llenarMeses()) { 
     Mes.addItem(llenarMese); 
    } 

    for (String llenarDia : p.llenarDias31()) { 
     Dia.addItem(llenarDia); 
    } 

    for (String llenarAnios : p.Anios()) { 
     Anio.addItem(llenarAnios); 
    } 
} 

А вот код класса Imagen(), который будет принимать в конструкторе строку:

public class Imagen extends JPanel { 
    String ruta; 
    private BufferedImage imag; 

    public Imagen(String path){ 
     ruta = path; 
     try{ 
      imag = ImageIO.read(new File("unknown.png")); 
     }catch(IOException ex){ 
      JOptionPane.showMessageDialog(null, "Error " + ex.getMessage()); 
     } 
    } 


    @Override 
    public void paint(Graphics g){ 
    super.paint(g); 
    Image Scaledimage = imag.getScaledInstance(this.getWidth(), this.getHeight(), Image.SCALE_SMOOTH); 
    g.drawImage(Scaledimage, 0, 0, null); 
    } 
} 
+1

Я хотел бы помочь, но, к сожалению, не могу загрузить проект из этого места как URL заблокирован в моем офисе. Не могли бы вы написать небольшую тестовую программу - SSCCE? Как вы устанавливаете изображение в панель? Используете ли вы JLabel в качестве контейнера изображений? Если да, избавитесь от всех внутренних фреймов, у вас есть JFrame с JPanel, у которого есть JLabel и кнопка. Когда вы нажимаете кнопку, выберите файл и установите его в метку. Если это работает, повторите его для вашего кода с внутренними кадрами. Остальное опубликуйте здесь код, и я могу помочь. – sethu

+1

Пожалуйста, не отправляйте код в ссылках гораздо меньше, как сжатый огромный сложный файл программы. Если вам нужна помощь здесь, вы должны сначала изолировать проблему в небольшой полностью содержащейся в ней программе, которую вы можете опубликовать здесь, опять же невелик, мы можем скомпилировать, запустить и продемонстрировать вашу проблему для нас, [минимальную примерную программу] (http://sscce.org). –

+0

@sethu Отредактировано. спасибо за ваш комментарий –

ответ

2

Есть множество способов сделать это, но, один из более предпочтительным, было бы обеспечить ImagePane с возможностью изменения отображаемого изображения без необходимости создания нового экземпляра.

Таким образом, вы могли бы просто передать ImagePane ссылку на изображение, которое вы хотите загрузить, и пусть это сделать его работу

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
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.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JDesktopPane; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.filechooser.FileFilter; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JDesktopPane dp = new JDesktopPane() { 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(600, 600); 
        } 
       }; 

       JInternalFrame inFrm = new JInternalFrame("Image", true, true, true, true); 
       inFrm.add(new ShowImagePane()); 
       inFrm.pack(); 
       inFrm.setVisible(true); 
       dp.add(inFrm); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(dp); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ShowImagePane extends JPanel { 

     private JFileChooser fc; 

     public ShowImagePane() { 
      setLayout(new BorderLayout()); 
      ImagePane imagePane = new ImagePane(); 
      add(imagePane); 
      JButton open = new JButton("Open..."); 
      open.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (fc == null) { 
         fc = new JFileChooser(); 
         fc.addChoosableFileFilter(new FileFilter() { 

          @Override 
          public boolean accept(File f) { 
           String name = f.getName().toLowerCase(); 
           return name.endsWith(".png") 
               || name.endsWith(".jpg") 
               || name.endsWith(".jpeg") 
               || name.endsWith(".bmp"); 
          } 

          @Override 
          public String getDescription() { 
           return "Images"; 
          } 
         }); 
         fc.setFileSelectionMode(JFileChooser.FILES_ONLY); 
         fc.setMultiSelectionEnabled(false); 
        } 

        switch (fc.showOpenDialog(ShowImagePane.this)) { 
         case JFileChooser.APPROVE_OPTION: 
          File selected = fc.getSelectedFile(); 
          try { 
           imagePane.setImageSource(selected); 
          } catch (IOException ex) { 
           ex.printStackTrace(); 
          } 
          break; 
        } 
       } 
      }); 
      add(open, BorderLayout.SOUTH); 
     } 

    } 

    public class ImagePane extends JPanel { 

     private BufferedImage bgImage; 
     private Image scaled; 

     public ImagePane(File source) throws IOException { 
      setImageSource(source); 
     } 

     public ImagePane() { 
     } 

     @Override 
     public void invalidate() { 
      super.invalidate(); 
      resizeImage(); 
     } 

     public void setImageSource(File source) throws IOException { 
      if (source != null) { 
       bgImage = ImageIO.read(source); 
       resizeImage(); 
      } else { 
       bgImage = null; 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return bgImage == null ? new Dimension(200, 200) : new Dimension(bgImage.getWidth(), bgImage.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (scaled != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       int x = (getWidth() - scaled.getWidth(this))/2; 
       int y = (getHeight() - scaled.getHeight(this))/2; 
       g2d.drawImage(scaled, x, y, this); 
       g2d.dispose(); 
      } 
     } 

     protected void resizeImage() { 
      if (bgImage != null) { 
       if (getWidth() < getHeight()) { 
        scaled = bgImage.getScaledInstance(this.getWidth(), -1, Image.SCALE_SMOOTH); 
       } else { 
        scaled = bgImage.getScaledInstance(-1, getHeight(), Image.SCALE_SMOOTH); 
       } 
       repaint(); 
      } 
     } 

    } 

} 

Image#getScaledInstance является ни самым быстрым или, что более важно, лучший алгоритм качество масштабирования. Поскольку для повторного масштабирования изображения может потребоваться время, вы должны делать это только тогда, когда вам нужно.

Взгляните на Java: maintaining aspect ratio of JPanel background image и Quality of Image after resize very low -- Java для получения более подробной информации и идей

+0

Спасибо, я просто использовал класс ImagePane, и я сделал:' ImagePane imgPane = новый ImagePane(); try { // imag = ImageIO.read (новый файл ("unknown.png")); imgPane.setImageSource (новый файл ("unknown.png")); //imgPane.setRounded(true); } catch (IOException ex) { ex.printStackTrace(); } jPanel1.add (imgPane, BorderLayout.CENTER); ' –

Смежные вопросы