在窗口中显示图像的问题
我需要选择具有文件打开对话框的图像,然后在窗口中显示它。但是,当我选择图像时,它不会显示在窗口中。在窗口中显示图像的问题
我创建了一个类,它用jmenubar和1个jmenuitem创建窗口。当我点击menuitem JfileChooser出现,然后我选择一些文件。但是什么都没发生。 我认为这个问题是在ActionListener的JFileChooser的(ImageFilter的是文档的Java过滤器)
public Frame(){
//create bars and window
mainframe = new JFrame("Window");
mainframe.setVisible(true);
mainframe.setSize(300, 300);
menubar = new JMenuBar();
mainer = new JMenu("Menu");
menubar.add(mainer);
//create items
item = new JMenuItem("Open",KeyEvent.VK_T);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));
item.getAccessibleContext().setAccessibleDescription("open image");
//action listener
item.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//open file dialog
choser = new JFileChooser();
choser.addChoosableFileFilter(new ImageFilter());
final int returnval = choser.showOpenDialog(menubar);
//action listener for JFileChooser
choser.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (returnval == JFileChooser.APPROVE_OPTION){
fc = choser.getSelectedFile();
try{
Panel panel = new ShowImage(fc.getName());
mainframe.getContentPane().add(panel);
}catch(Exception exc){};
}
}
}
);
}
}
);
mainer.add(item);
mainframe.setJMenuBar(menubar);
}
ShowImage类
class ShowImage extends Panel{
BufferedImage image;
public ShowImage(String imagename) throws IOException {
File input = new File(imagename);
image = ImageIO.read(input);
}
public void paint(Graphics g){
g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);
}
}
PS的另一个问题是,它说明不了什么,直到我改变窗口的大小。
扩展JPanel代替Panel
,并覆盖paintComponent方法,即:
class ShowImage extends JPanel{
public void paintComponent(Graphics g){
...
}
}
而且,也没有必要addActionListener
上JFileChooser
,只是检查返回值,并采取相应的行动,即:
final int returnval = choser.showOpenDialog(menubar);
if (returnval == JFileChooser.APPROVE_OPTION){
...
}
在“JScrollPane”中简单地使用JLabel来显示图像会更好。无需重写任何内容,如果图像对于指定区域的大小太大,滚动条会自动出现。 – 2012-04-08 17:39:34
我很肯定这条线会造成问题:
Panel panel = new ShowImage(fc.getName());
getName()将返回文件的名称。例如,如果您选择带有名为image.jpg的JFileChooser的图像,getName将返回“image.jpg”。如果您选择的文件存储在项目的根文件夹中,这将只会显示图像。我会将getName()
更改为getAbsoultePath()
,这将返回完全修补程序(e.i c:\ desktop \ image.jpg),这是最想要的。
另外,作为最大指出,你应该重写paintComponent而不是油漆:
protected void paintComponent(Graphics g){
g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);
}
*“你应该重写paintComponent而不是paint:”*当你有一个可用的时候,你也应该使用'ImageObserver'。当在组件中绘画时,为'this'交换'null',并且你有一个。 – 2012-04-08 17:41:40
'调用setVisible()/的setSize()'这样的事情一定要来在最后,一旦你已经添加的东西到你的容器。把这些东西放在构造函数的末尾,在mainFrame.setJMenuBar(...)','setVisible(true)'必须在最后添加所有内容后才能顺利工作。如果你不知道更好地尝试再次浏览Swing的教程一段时间。 – 2012-04-08 16:50:15