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