我有一个从网站上获取随机图像的应用程序。我有一个带有JPanel的JFrame。图像被添加到JLabel中。 我的问题是新图像不会显示。在菜单栏中选择“新图像”选项后,我希望将旧图像替换为新图像。
public class GUI extends JFrame implements ActionListener {
private JPanel imagePanel;
private JScrollPane scroll;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem menuItemNew;
private JLabel label;
public GUI(String title) throws MalformedURLException, IOException {
super(title);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
newImage();
initComponents();
setSize(600, 400);
setLocationRelativeTo(null);
initMenu();
setVisible(true);
}
private void initComponents() {
scroll = new JScrollPane(imagePanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(scroll, BorderLayout.CENTER);
}
private void initMenu() {
menuBar = new JMenuBar();
menu = new JMenu("File");
menuBar.add(menu);
menuItemNew = new JMenuItem("New image");
menu.add(menuItemNew);
menuItemNew.addActionListener(this);
setJMenuBar(menuBar);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(menuItemNew)) {
newImage();
}
}
private void newImage() throws MalformedURLException, IOException {
URL imageURL = new URL("http://xxxxxxx");
BufferedImage buffImg = ImageIO.read(imageURL);
ImageIcon icon = new ImageIcon(buffImg);
label = new JLabel("", icon, JLabel.CENTER);
label.setIcon(icon);
imagePanel = new JPanel(new BorderLayout());
imagePanel.add(label, BorderLayout.CENTER);
revalidate();
repaint();
}
}
答案 0 :(得分:3)
问题在于,当您重新创建imagePanel时,它永远不会与滚动窗格关联。
解决此问题的最简单方法是将imagePanel和标签创建移动到initComponents中,然后将标签设置为newImage()中的字段
private JLabel imageLabel;
private void newImage() throws MalformedURLException, IOException {
...
imageLabel.setIcon(icon);
revalidate();
repaint();
}
另外,作为下一个问题,您几乎可以肯定的是,随机网页图像尺寸不合适,我强烈推荐filthyrichclients提供的图像尺寸调整实用程序方法。
我实际上也强烈推荐book,因为这是实际证明Swing力量的少数几本书之一......