无法获取要更新的图像图标

时间:2015-02-13 21:35:12

标签: java swing

我有一个从网站上获取随机图像的应用程序。我有一个带有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();
    }
 }

1 个答案:

答案 0 :(得分:3)

问题在于,当您重新创建imagePanel时,它永远不会与滚动窗格关联。

解决此问题的最简单方法是将imagePanel和标签创建移动到initComponents中,然后将标签设置为newImage()中的字段

private JLabel imageLabel;
private void newImage() throws MalformedURLException, IOException {
    ...
    imageLabel.setIcon(icon); 
    revalidate();    
    repaint();
} 

另外,作为下一个问题,您几乎可以肯定的是,随机网页图像尺寸不合适,我强烈推荐filthyrichclients提供的图像尺寸调整实用程序方法。

我实际上也强烈推荐book,因为这是实际证明Swing力量的少数几本书之一......