2015-05-01 141 views
0

只有在調整JFrame的大小後才顯示圖像。我希望它在我用JFileChooser獲取圖像後立即顯示。我該如何解決?我需要使用paint()方法。如何在Java中按下按鈕後顯示圖像?

[我需要添加更多的細節只是爲了讓過去的發帖驗證,我不知道還有什麼要補充。] 見我下面的Java代碼:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
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 javax.imageio.ImageIO; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class ImgViewTester extends JFrame implements ActionListener 
{ 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu fileMenu = new JMenu("File"); 
    JMenuItem openItem = new JMenuItem("Open Image...");  

    JPanel imagePanel; 

    JFileChooser fc = new JFileChooser(); 

    File imgFile; 
    String imgFileName; 
    String imgTitle; 
    protected Image img = null; 
    Image newImg = null; 
    Image imgResized = null; 
    BufferedImage buffImg = null; 

    boolean doGetImg = false; 

    public ImgViewTester() 
    { 
     initialize(); 
    } 

    public void initialize() 
    { 
     this.setTitle("Image Editor"); 
     this.setSize(700, 700); 
     this.setLayout(new BorderLayout()); 

     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setJMenuBar(menuBar); 
     menuBar.add(fileMenu); 
     fileMenu.add(openItem); 
     openItem.addActionListener(this);     

     ImagePanel theImagePanel = new ImagePanel();   
     this.add(theImagePanel, BorderLayout.WEST); 

     this.pack(); 
     this.setVisible(true); 
    } 

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

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource().equals(openItem)) 
     { 
      doGetImg = true; 

      JFileChooser imgFileChooser = new JFileChooser(); 
      FileNameExtensionFilter imgFilter = 
        new FileNameExtensionFilter("GIF, PNG, JPEG or JPG files", 
          "gif", "png", "jpg", "jpeg"); 

      imgFileChooser.setFileFilter(imgFilter); 
      int returnVal = imgFileChooser.showOpenDialog(this); 
      imgFile = imgFileChooser.getSelectedFile(); 

      //variables for getting name of image 
      imgFileName = imgFile.getName(); 
      imgTitle = imgFileName.substring(imgFileName.lastIndexOf("/") + 1); 

      if(returnVal == JFileChooser.APPROVE_OPTION) 
      { 
       try 
       { 
        img = ImageIO.read(imgFile); 
        img = img.getScaledInstance(500, -1, Image.SCALE_DEFAULT); 
       } 
       catch(IOException ioe) 
       { 
        System.out.println("Oops! Image I/O exception occurred!"); 
        ioe.printStackTrace(); 
       } 

       buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB); 
        revalidate(); 
      } 
      else if(returnVal == JFileChooser.CANCEL_OPTION) 
      { 
       //handle cancel operation 
      } 

     } 
    } 

    class ImagePanel extends JPanel 
    { 
     public ImagePanel() 
     { 
      this.setPreferredSize(new Dimension(500, 500)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) 
     { 
      Graphics2D _g2d; 
      Graphics _gb; 

      if(doGetImg == true) 
      { 
       System.out.println("inside ORIGINAL IMAGE paint method"); 

       super.paintComponents(g); 
       _g2d = (Graphics2D) g; 
       _gb = buffImg.getGraphics(); 

       _gb.drawImage(img, 0, 0, null); 
       _gb.dispose(); 
       _g2d.drawImage(buffImg, null, 0, 0); 
       _g2d.dispose();            
      } 
     } 
    } 

}//end of class 
+0

僅供參考,不管你在做什麼,你總是應該調用'super.paintComponent'; Swing組件默認是雙緩衝。您應該將'this'作爲ImageObserver傳遞 – MadProgrammer

回答

0
import java.awt.BorderLayout; 
import java.awt.Dimension; 
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 javax.imageio.ImageIO; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class ImgViewTester extends JFrame implements ActionListener 
{ 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu fileMenu = new JMenu("File"); 
    JMenuItem openItem = new JMenuItem("Open Image...");  

    JPanel imagePanel; 

    JFileChooser fc = new JFileChooser(); 

    File imgFile; 
    String imgFileName; 
    String imgTitle; 
    protected Image img = null; 
    Image newImg = null; 
    Image imgResized = null; 
    BufferedImage buffImg = null; 

    boolean doGetImg = false; 

    public ImgViewTester() 
    { 
     initialize(); 
    } 

    public void initialize() 
    { 
     this.setTitle("Image Editor"); 
     this.setSize(700, 700); 
     this.setLayout(new BorderLayout()); 

     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setJMenuBar(menuBar); 
     menuBar.add(fileMenu); 
     fileMenu.add(openItem); 
     openItem.addActionListener(this);     

     ImagePanel theImagePanel = new ImagePanel();   
     this.add(theImagePanel, BorderLayout.WEST); 

     this.pack(); 
     this.setVisible(true); 
    } 

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

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource().equals(openItem)) 
     { 
      doGetImg = true; 

      JFileChooser imgFileChooser = new JFileChooser(); 
      FileNameExtensionFilter imgFilter = 
        new FileNameExtensionFilter("GIF, PNG, JPEG or JPG files", 
          "gif", "png", "jpg", "jpeg"); 

      imgFileChooser.setFileFilter(imgFilter); 
      int returnVal = imgFileChooser.showOpenDialog(this); 
      imgFile = imgFileChooser.getSelectedFile(); 

      //variables for getting name of image 
      imgFileName = imgFile.getName(); 
      imgTitle = imgFileName.substring(imgFileName.lastIndexOf("/") + 1); 

      if(returnVal == JFileChooser.APPROVE_OPTION) 
      { 
       try 
       { 
        img = ImageIO.read(imgFile); 
        img = img.getScaledInstance(500, -1, Image.SCALE_DEFAULT); 
       } 
       catch(IOException ioe) 
       { 
        System.out.println("Oops! Image I/O exception occurred!"); 
        ioe.printStackTrace(); 
       } 

       buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB); 
        repaint(); 
      } 
      else if(returnVal == JFileChooser.CANCEL_OPTION) 
      { 
       //handle cancel operation 
      } 

     } 
    } 

    class ImagePanel extends JPanel 
    { 
     public ImagePanel() 
     { 
      this.setPreferredSize(new Dimension(500, 500)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) 
     { 
      Graphics2D _g2d; 
      Graphics _gb; 

      if(doGetImg == true) 
      { 
       System.out.println("inside ORIGINAL IMAGE paint method"); 

       super.paintComponents(g); 
       _g2d = (Graphics2D) g; 
       _gb = buffImg.getGraphics(); 

       _gb.drawImage(img, 0, 0, null); 
       _gb.dispose(); 
       _g2d.drawImage(buffImg, null, 0, 0); 
       _g2d.dispose();            
      } 
     } 
    } 

}//end of class 

只是改變重新驗證重繪

相關問題