【发布时间】:2012-04-09 00:25:59
【问题描述】:
我需要选择带有文件打开对话框的图像,然后在窗口中显示它。但是当我选择图像时,它不会显示在窗口中。
我创建了使用 jmenubar 和 1 个 jmenuitem 创建窗口的类。当我点击 menuitem JfileChooser 出现然后我选择一些文件。但随后什么也没有发生。 我认为问题出在 JFileChooser 的 actionListener 中(ImageFilter 是来自 docs 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);
}
}
P.S 另一个问题是在我更改窗口大小之前它什么都不显示。
【问题讨论】:
-
setVisible()/setSize()这样的事情必须在最后出现,一旦你将东西添加到你的容器中。把这些东西放在构造函数的最后,为了让mainFrame.setJMenuBar(...)之后的事情顺利进行,setVisible(true)必须在最后,在你添加完所有东西之后。如果你不知道,最好再试一试 Swing 的教程。