在图片之间切换(JFrame,JButton)

问题描述 投票:0回答:1

我正在尝试创建一个窗口,当按下“更改”按钮时,会在图片之间切换。当我尝试运行该程序时,会弹出Java徽标,就像该程序即将启动一样,但是随后它消失了。我现在有点困惑,希望有人可以给我提示可能有什么问题。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.imageio.*;
import javax.swing.*;

public class ImageViewer extends JFrame{

private JPanel panel;
private JLabel imageLabel;
private JButton button;
private Icon[] icons = {};
private static final long serialVersionUID = 1L;

public ImageViewer() {

    try {
        panel = new JPanel();
        URL url1 = new URL("http://www.sm.luth.se/csee/courses/d0010e/l/prob/10tj5Ei9o/LTU-Teatern.jpg");
        URL url2 = new URL("http://www.sm.luth.se/csee/courses/d0010e/l/prob/10tj5Ei9o/LTU-Vetenskapens-hus.jpg");
        Icon image = new ImageIcon(ImageIO.read(url1));
        Icon image2 = new ImageIcon(ImageIO.read(url2));
        icons[0] = image;
        icons[1] = image2;
        imageLabel = new JLabel();
        panel.add(button);
        panel.add(imageLabel);
        button = new JButton("Change");
        button.addActionListener(new ActionListener() {     
            private boolean value = false;
            {
            }

            public void actionPerformed(ActionEvent arg0) {
                value = value == true ? false : true;
                if (value == false) {
                    imageLabel.setIcon(icons[0]);
                }else { 
                    imageLabel.setIcon(icons[1]);
                }
            }
        });
        this.setContentPane(panel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }catch (Exception e) {
    }
}

public static void main(String args[]) {
    new ImageViewer();
}
}
java swing jframe jbutton
1个回答
0
投票

首先,这是我为了给您一些提示而创建的。

First Image

Second Image

这是代码。提示将在代码之后。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ImageViewer implements Runnable {

    private boolean isImage1;

    private BufferedImage image;

    private ImageData imageData;

    private JLabel label;

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new ImageViewer());
    }

    public ImageViewer() {
        this.imageData = new ImageData();
        this.image = imageData.getImage1();
        this.isImage1 = true;
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Image Viewer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        label = new JLabel(new ImageIcon(image));
        panel.add(label);

        JButton button = new JButton("Change");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (isImage1) {
                    image = imageData.getImage2();
                } else {
                    image = imageData.getImage1();
                }
                label.setIcon(new ImageIcon(image));
                isImage1 = !isImage1;
            }
        });
        panel.add(button);

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public class ImageData {

        private BufferedImage image1;
        private BufferedImage image2;

        public ImageData() {
            URL url1;
            URL url2;
            try {
                url1 = new URL("http://www.sm.luth.se/csee/courses/d0010e/l/prob/10tj5Ei9o/LTU-Teatern.jpg");
                url2 = new URL("http://www.sm.luth.se/csee/courses/d0010e/l/prob/10tj5Ei9o/LTU-Vetenskapens-hus.jpg");
                this.image1 = readImage(url1);
                this.image2 = readImage(url2);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }

        private BufferedImage readImage(URL url) {
            try {
                return ImageIO.read(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        public BufferedImage getImage1() {
            return image1;
        }

        public BufferedImage getImage2() {
            return image2;
        }

    }
}

所以这里是提示。

  1. 除非您打算覆盖一个或多个类方法,否则请不要扩展JFrame或任何Swing组件。

  2. 始终在事件调度线程(EDT)上启动Swing项目。为了方便起见,我在主ImageViewer类中实现了Runnable。您的main方法应始终包含对SwingUtilities invokeLater的调用。

  3. 我将图像的读取移至其自己的数据类。始终将数据与视图分开。我通常使用模型/视图/控制器架构来创建Swing项目。

  4. 我检查了URL中的错误或实际图像读取。如果发生错误,它将打印出堆栈跟踪,这将有助于我发现错误。切勿将整个方法放在try-catch块中。

  5. 唯一需要作为类变量的Swing组件是JLabel组件。仅使整个类都需要的类变量。我的习惯是将所有类变量以及类方法设为私有。仅公开需要公开的方法。

一旦我做了所有这些事情,编写动作监听器就变得微不足道了。

© www.soinside.com 2019 - 2024. All rights reserved.