Java 如何使用JFileChooser在JPanel中显示图像
我正在尝试使用一个菜单栏,它允许用户选择一个文件并在JPanel中显示它,并且图像应该完全适合JPanel。但JFileChooser在从对话框中成功选择文件时不会显示任何内容。我试着参考了很多链接:和 但一切都没有结果。请帮忙。以下是我的代码:Java 如何使用JFileChooser在JPanel中显示图像,java,image,swing,jpanel,jfilechooser,Java,Image,Swing,Jpanel,Jfilechooser,我正在尝试使用一个菜单栏,它允许用户选择一个文件并在JPanel中显示它,并且图像应该完全适合JPanel。但JFileChooser在从对话框中成功选择文件时不会显示任何内容。我试着参考了很多链接:和 但一切都没有结果。请帮忙。以下是我的代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.File; class Main { private JFrame j; private
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
class Main {
private JFrame j;
private JMenu jmenu;
private JMenuBar jbar;
private JMenuItem jmi, jexit;
private JPanel jpanel, jpanelbar;
private JButton jpre, jnext;
JLabel image;
ImageIcon ic;
Image img;
Main() {
j = new JFrame("Image Viewer");
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// j.setExtendedState(Frame.MAXIMIZED_BOTH);
// j.setLocationRelativeTo(null);
j.setLocationByPlatform(true);
j.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
jpanel = new JPanel();
c.anchor = GridBagConstraints.PAGE_START;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = c.gridy = 0;
c.gridwidth = 2;
// c.weightx=0.1;
c.weighty = 0.1;
c.ipady = 600;
c.insets = new Insets(5, 5, 10, 5);
// jpanel.setBackground(Color.BLACK);
j.add(jpanel, c);
jpanelbar = new JPanel();
jpanelbar.setBackground(Color.red);
c.weightx = 0.1;
c.gridx = 0;
c.gridy = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
c.ipady = 150;
j.add(jpanelbar, c);
jpanelbar.setLayout(new GridBagLayout());
GridBagConstraints x = new GridBagConstraints();
jpre = new JButton("Previous");
x.gridx = 0;
x.gridy = 0;
x.gridwidth = 1;
x.weightx = 0.1;
// x.insets=new Insets(5,5,5,5);
// x.fill=GridBagConstraints.NONE;
jpanelbar.add(jpre, x);
jnext = new JButton("Next");
x.gridx = 1;
jpanelbar.add(jnext, x);
// Creating Menu
jbar = new JMenuBar();
jmenu = new JMenu("File");
jmi = new JMenuItem("Open");
jmi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String sname = file.getName();
image = new JLabel("", new ImageIcon(sname), JLabel.CENTER);
jpanel.add(image, BorderLayout.CENTER);
}
}
});
jexit = new JMenuItem("Exit");
jexit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
jmenu.add(jmi);
jmenu.add(jexit);
jbar.add(jmenu);
j.setJMenuBar(jbar);
j.setSize(800, 600);
j.setResizable(false);
j.setVisible(true);
}
public static void main(String s[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Main();
}
});
}
}
更新代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
class Main {
private JFrame j;
private JMenu jmenu;
private JMenuBar jbar;
private JMenuItem jmi, jexit;
private JPanel jpanel, jpanelbar;
private JButton jpre, jnext;
JLabel image;
ImageIcon ic;
Image img;
Main() {
j = new JFrame("Image Viewer");
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// j.setExtendedState(Frame.MAXIMIZED_BOTH);
// j.setLocationRelativeTo(null);
j.setLocationByPlatform(true);
j.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
jpanel = new JPanel();
c.anchor = GridBagConstraints.PAGE_START;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = c.gridy = 0;
c.gridwidth = 2;
// c.weightx=0.1;
c.weighty = 0.1;
c.ipady = 600;
c.insets = new Insets(5, 5, 10, 5);
// jpanel.setBackground(Color.BLACK);
j.add(jpanel, c);
jpanelbar = new JPanel();
jpanelbar.setBackground(Color.red);
c.weightx = 0.1;
c.gridx = 0;
c.gridy = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
c.ipady = 150;
j.add(jpanelbar, c);
jpanelbar.setLayout(new GridBagLayout());
GridBagConstraints x = new GridBagConstraints();
jpre = new JButton("Previous");
x.gridx = 0;
x.gridy = 0;
x.gridwidth = 1;
x.weightx = 0.1;
// x.insets=new Insets(5,5,5,5);
// x.fill=GridBagConstraints.NONE;
jpanelbar.add(jpre, x);
jnext = new JButton("Next");
x.gridx = 1;
jpanelbar.add(jnext, x);
// Creating Menu
jbar = new JMenuBar();
jmenu = new JMenu("File");
jmi = new JMenuItem("Open");
jmi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String sname = file.getName();
image = new JLabel("", new ImageIcon(sname), JLabel.CENTER);
jpanel.add(image, BorderLayout.CENTER);
jpanel.revalidate();
jpanel.repaint();
}
}
});
jexit = new JMenuItem("Exit");
jexit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
jmenu.add(jmi);
jmenu.add(jexit);
jbar.add(jmenu);
j.setJMenuBar(jbar);
j.setSize(800, 600);
j.setResizable(false);
j.setVisible(true);
}
public static void main(String s[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Main();
}
});
}
}
您需要调用
jpanel.revalidate();
jpanel.repaint();
在将JLabel
image
添加到jpanel
之后,为什么不在启动时简单地添加JLabel
来设置image
?而不是getName()
使用文件上的getAbsolutePath()
对象并调用repaint()
和revalidate()
渲染图像后
下面的代码应该可以解决您的问题:
jmi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String sname = file.getAbsolutePath(); //THIS WAS THE PROBLEM
image = new JLabel("", new ImageIcon(sname), JLabel.CENTER);
jpanel.add(image, BorderLayout.CENTER);
jpanel.revalidate(); //ADD THIS AS WELL
jpanel.repaint(); //ADD THIS AS WELL
}
}
});
我把你的密码给你了。还有很多很多问题需要解决
- 我在你的jpanel中添加了一个BorderLayout
- 我将图像的初始化从您的打开菜单操作侦听器中移出,就像Reimeus告诉您的那样
- 我用ImageIO读取图像
你最终需要这个答案
这是我的代码版本。愿上帝怜悯你的灵魂
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
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.SwingUtilities;
class Main {
private JFrame j;
private JMenu jmenu;
private JMenuBar jbar;
private JMenuItem jmi, jexit;
private JPanel jpanel, jpanelbar;
private JButton jpre, jnext;
JLabel image;
ImageIcon ic;
Image img;
Main() {
j = new JFrame("Image Viewer");
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// j.setExtendedState(Frame.MAXIMIZED_BOTH);
// j.setLocationRelativeTo(null);
j.setLocationByPlatform(true);
j.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
jpanel = new JPanel();
jpanel.setLayout(new BorderLayout());
image = new JLabel(" ");
jpanel.add(image, BorderLayout.CENTER);
c.anchor = GridBagConstraints.PAGE_START;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = c.gridy = 0;
c.gridwidth = 2;
// c.weightx=0.1;
c.weighty = 0.1;
c.ipady = 600;
c.insets = new Insets(5, 5, 10, 5);
// jpanel.setBackground(Color.BLACK);
j.add(jpanel, c);
jpanelbar = new JPanel();
jpanelbar.setLayout(new GridBagLayout());
jpanelbar.setBackground(Color.red);
GridBagConstraints x = new GridBagConstraints();
jpre = new JButton("Previous");
x.gridx = 0;
x.gridy = 0;
x.gridwidth = 1;
x.weightx = 0.1;
// x.insets=new Insets(5,5,5,5);
// x.fill=GridBagConstraints.NONE;
jpanelbar.add(jpre, x);
jnext = new JButton("Next");
x.gridx = 1;
jpanelbar.add(jnext, x);
c.weightx = 0.1;
c.gridx = 0;
c.gridy = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
c.ipady = 150;
j.add(jpanelbar, c);
// Creating Menu
jbar = new JMenuBar();
jmenu = new JMenu("File");
jmi = new JMenuItem("Open");
jmi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
image.setIcon(new ImageIcon(ImageIO.read(file)));
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
jexit = new JMenuItem("Exit");
jexit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
jmenu.add(jmi);
jmenu.add(jexit);
jbar.add(jmenu);
j.setJMenuBar(jbar);
// j.setSize(800, 600);
j.pack();
j.setResizable(true);
j.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Main();
}
});
}
}
添加这些行后,它仍不显示。我没有得到您指定的第二种方法。repaint
自JDK1.0以来就存在了。你能发布你更新的代码吗?@crazy4当revalidate
调整面板的大小jpanel
时,你的按钮正在消失。如果调用j.pack()
,您将看到首选的尺寸。问题在于大型ipady
设置-重新验证后,按钮面板被推到JFrame
的边界之外。嘿!谢谢结果是这样的。但是你能解释一下你到底做了什么吗?请。您使用的是file.getName()
,这将使渲染过程在当前目录中查找图像。我将其更改为file.getAbsolutePath()
。除了@Reimeus提到的,您应该调用revalidate()
和/或repaint()
,以使UI更改生效。此外,如果它解决了您的问题,请将其标记为答案。现在,在重新绘制()和重新验证()时,下部面板和按钮已消失。为什么?我希望在不丢失图像的情况下显示图像。如果图像的大小大于您的帧的大小,则会发生这种情况。使用较小的图像进行测试。要知道如何调整图像大小,使其适合JLabel,请参见此,我已尝试使用更小的图像,即使是分辨率为110x25像素的图像。但是下面的按钮没有出现。此代码生成“不支持的图像类型”错误。有什么解决办法吗?