如何将JFrame的Panel大小调整为选中图片的尺寸?附现有代码
问题原因
你代码的核心错误有2处:
- 你新创建了
NewJFrame实例mainFrame,但你修改icon和尺寸的JLabelImage是当前旧窗口的组件,和新窗口没有关联,新窗口内的图片控件没有被修改,自然不会跟着图片调整大小 - 修改组件尺寸后没有触发布局刷新,改动不会生效
修改方案
方案1:在当前窗口加载图片并调整尺寸(不需要新建窗口)
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { FileNameExtensionFilter fnef = new FileNameExtensionFilter("IMAGES", "png", "jpg", "jpeg"); JFileChooser ImageFile = new JFileChooser(); ImageFile.addChoosableFileFilter(fnef); int openDialog = ImageFile.showOpenDialog(null); if (openDialog == JFileChooser.APPROVE_OPTION) { File choosenFile = ImageFile.getSelectedFile(); String choosenFilePath = choosenFile.getAbsolutePath(); JOptionPane.showMessageDialog(null, choosenFilePath); // 加载图片 ImageIcon imgIcon = new ImageIcon(choosenFilePath); // 设置图片到当前窗口的JLabel JLabelImage.setIcon(imgIcon); JLabelImage.setPreferredSize(new Dimension(imgIcon.getIconWidth(),imgIcon.getIconHeight())); // 刷新当前窗口布局 this.revalidate(); this.repaint(); this.pack(); this.setLocationRelativeTo(null); } }
方案2:弹出新窗口加载图片并调整尺寸
如果你确实需要弹出新窗口显示图片,要先获取新窗口内的JLabel实例再修改:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { FileNameExtensionFilter fnef = new FileNameExtensionFilter("IMAGES", "png", "jpg", "jpeg"); JFileChooser ImageFile = new JFileChooser(); ImageFile.addChoosableFileFilter(fnef); int openDialog = ImageFile.showOpenDialog(null); if (openDialog == JFileChooser.APPROVE_OPTION) { File choosenFile = ImageFile.getSelectedFile(); String choosenFilePath = choosenFile.getAbsolutePath(); JOptionPane.showMessageDialog(null, choosenFilePath); // 加载图片 ImageIcon imgIcon = new ImageIcon(choosenFilePath); // 实例化新窗口,获取新窗口内的图片JLabel控件 NewJFrame mainFrame = new NewJFrame(); // 注意此处修改的是新窗口实例内的JLabel,要确保新窗口的JLabel是public属性或者提供了getter方法获取 mainFrame.JLabelImage.setIcon(imgIcon); mainFrame.JLabelImage.setPreferredSize(new Dimension(imgIcon.getIconWidth(),imgIcon.getIconHeight())); // 刷新新窗口布局 mainFrame.pack(); mainFrame.setLocationRelativeTo(null); mainFrame.setVisible(true); } }
注意事项
- 确保存放
JLabelImage的容器布局管理器支持自适应尺寸,比如FlowLayout,如果使用BorderLayout请将JLabelImage放在CENTER区域 - 如果你的窗口有菜单栏、状态栏等固定组件,
pack()会自动把这些组件的尺寸算入总窗口大小,不会压缩图片
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

