Java 在JFrame中切换图片

Java 在JFrame中切换图片,java,swing,jframe,awt,Java,Swing,Jframe,Awt,嗨,我在JFrame中切换图片时遇到问题。我正在将JFrame初始化为黑色图片,接下来我要将“sample2.jpg”加载到它: Display.java public class Display extends Canvas implements Runnable{ /** * */ private static final long serialVersionUID = 1L; public static int WIDTH=1280; public static int HE

嗨,我在JFrame中切换图片时遇到问题。我正在将JFrame初始化为黑色图片,接下来我要将“sample2.jpg”加载到它:

Display.java

public class Display extends Canvas  implements Runnable{
/**
 * 
 */
private static final long serialVersionUID = 1L;



public static int WIDTH=1280;
public static int HEIGHT=720;
public static final String TITLE = "rainbow";


private Thread thread;
private boolean running = false;
private Render render;
private Screen screen;
private BufferedImage img;
private int pixels[];


public Display(){
    Dimension size = new Dimension(WIDTH,HEIGHT);
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    screen = new Screen(WIDTH, HEIGHT);
    img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();


}


public synchronized void start(){
    if(running) 
        return;
    running = true;
    thread = new Thread(this);
    thread.start();

    //System.out.println("working...");
}

public synchronized void stop(){
    if(!running)
        return;
    running = false;
    try{
        thread.join();
    } catch(Exception e){
        e.printStackTrace();
        System.exit(0);
    }
}   

public void run(){

    while(running){
        render();
    }
}

private void render(){
BufferStrategy bs = this.getBufferStrategy();
if(bs == null)
{
    createBufferStrategy(3);
    return;
}
screen.render();
for(int i=0; i<WIDTH*HEIGHT; i++)
{
    pixels[i] = screen.pixels[i];

}

Graphics g = bs.getDrawGraphics();
g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
g.dispose();
bs.show();
}

public static void main(String[] args){
    Display game = new Display();
    JFrame frame = new JFrame();
    frame.add(game);

    frame.setTitle(TITLE);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.pack();
    frame.setVisible(true);

    System.out.println("running ...");

    game.start();
}

}
在函数
render
In class屏幕中,当我执行以下操作时:

public void render(){
    for(int i =0 ; i <width*height;i++){
        pixels[i]= Image.floor.pixels[i];
    }

    test.drawRainbow();
    draw(test,0,0);
}
public void render(){

对于(inti=0;i您创建Swing GUI的方法是向后的

这是一个Swing GUI,它显示了来自Internet的6幅图片

下面介绍如何创建Swing GUI

  • 创建一个保存图像信息的GUI模型。我创建了一个ImageInformation类来保存一个图像的信息。我创建了一个ImageInformation列表来保存所有图像

  • 我创建了一个JFrame来保存所有Swing组件

  • 我通过调用SwingUtilities invokeLater方法将Swing组件的创建和使用放在了上。Oracle和我要求您在事件调度线程上启动所有Swing应用程序

  • 我创建了一个图像JPanel来保存图像信息,并创建了一个控制JPanel fpr JRadioButtons

  • 代码如下:

    package com.ggl.testing;
    
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.SwingUtilities;
    import javax.swing.border.EtchedBorder;
    import javax.swing.border.TitledBorder;
    
    public class ImageDisplay implements Runnable {
    
        private ItemListener listener;
    
        private JFrame frame;
    
        private JLabel titleLabel;
        private JLabel imageLabel;
        private JLabel descriptionLabel;
    
        private List<ImageInformation> images;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new ImageDisplay());
        }
    
        public ImageDisplay() {
            this.images = setImageInformation();
        }
    
        @Override
        public void run() {
            frame = new JFrame("Image Display");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.add(createControlPanel(), BorderLayout.WEST);
            frame.add(createImagePanel(), BorderLayout.CENTER);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        private JPanel createImagePanel() {
            JPanel imagePanel = new JPanel();
            imagePanel.setLayout(new BorderLayout());
    
            ImageInformation defaultImageInformation = images.get(0);
    
            titleLabel = new JLabel(defaultImageInformation.getTitle());
            titleLabel.setHorizontalAlignment(JLabel.CENTER);
            imagePanel.add(titleLabel, BorderLayout.NORTH);
    
            imageLabel = new JLabel(new ImageIcon(
                    defaultImageInformation.getImage()));
            JScrollPane scrollPane = new JScrollPane(imageLabel);
            imagePanel.add(scrollPane, BorderLayout.CENTER);
    
            descriptionLabel = new JLabel(defaultImageInformation.getDescription());
            descriptionLabel.setHorizontalAlignment(JLabel.CENTER);
            imagePanel.add(descriptionLabel, BorderLayout.SOUTH);
            return imagePanel;
        }
    
        private JPanel createControlPanel() {
            JPanel panel = new JPanel();
            panel.setBorder(new TitledBorder(new EtchedBorder(), "Images"));
            panel.setLayout(new GridLayout(0, 1));
    
            ButtonGroup group = new ButtonGroup();
    
            listener = new ImageListener();
    
            for (int i = 0; i < images.size(); i++) {
                ImageInformation imageInformation = images.get(i);
                JRadioButton button = new JRadioButton(imageInformation.getTitle());
                if (i == 0) {
                    button.setSelected(true);
                }
                button.addItemListener(listener);
                group.add(button);
                panel.add(button);
            }
    
            return panel;
        }
    
        private List<ImageInformation> setImageInformation() {
            List<ImageInformation> images = new ArrayList<ImageInformation>();
    
            // Here, you would get your images
            Image image1 = getImage("http://4.bp.blogspot.com/-vfRL5DamWFs/"
                    + "T2nn6D_EUfI/AAAAAAAABB8/Kc9Y33qYWJo/s1600/People-Power.jpg");
            Image image2 = getImage("http://www.jeffjonesillustration.com/images/"
                    + "illustration/00601-group-of-people.jpg");
            Image image3 = getImage("http://www.careersusa.com/portals/0/BusinessPeopleImage2.png");
            Image image4 = getImage("http://www.druginfo.sl.nsw.gov.au/images/teens.jpg");
            Image image5 = getImage("http://www.pesconsulting.co.uk/wp-content/uploads/"
                    + "2013/03/kevin-thom-2010-people-collage.jpg");
            Image image6 = getImage("http://www.emcdda.europa.eu/attachements.cfm/"
                    + "att_77302_EN_young-people-480px.jpg");
    
            images.add(new ImageInformation(image1, "Image 1",
                    "Image 1 Description"));
            images.add(new ImageInformation(image2, "Image 2",
                    "Image 2 Description"));
            images.add(new ImageInformation(image3, "Image 3",
                    "Image 3 Description"));
            images.add(new ImageInformation(image4, "Image 4",
                    "Image 4 Description"));
            images.add(new ImageInformation(image5, "Image 5",
                    "Image 5 Description"));
            images.add(new ImageInformation(image6, "Image 6",
                    "Image 6 Description"));
    
            return images;
        }
    
        private Image getImage(String fileName) {
            try {
                return ImageIO.read(new URL(fileName));
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        private ImageInformation getImageInformation(String title) {
            for (ImageInformation imageInformation : images) {
                if (title.equals(imageInformation.getTitle())) {
                    return imageInformation;
                }
            }
    
            return null;
        }
    
        public class ImageListener implements ItemListener {
    
            @Override
            public void itemStateChanged(ItemEvent event) {
                if (event.getStateChange() == ItemEvent.SELECTED) {
                    JRadioButton button = (JRadioButton) event.getItem();
                    String labelText = button.getText();
                    ImageInformation imageInformation = getImageInformation(labelText);
                    if (imageInformation != null) {
                        titleLabel.setText(imageInformation.getTitle());
                        imageLabel.setIcon(new ImageIcon(imageInformation
                                .getImage()));
                        descriptionLabel.setText(imageInformation.getDescription());
                    }
                }
            }
    
        }
    
        public class ImageInformation {
    
            private final Image image;
    
            private final String title;
            private final String description;
    
            public ImageInformation(Image image, String title, String description) {
                this.image = image;
                this.title = title;
                this.description = description;
            }
    
            public Image getImage() {
                return image;
            }
    
            public String getTitle() {
                return title;
            }
    
            public String getDescription() {
                return description;
            }
    
        }
    }
    
    package com.ggl.testing;
    导入java.awt.BorderLayout;
    导入java.awt.GridLayout;
    导入java.awt.Image;
    导入java.awt.event.ItemEvent;
    导入java.awt.event.ItemListener;
    导入java.io.IOException;
    导入java.net.URL;
    导入java.util.ArrayList;
    导入java.util.List;
    导入javax.imageio.imageio;
    导入javax.swing.ButtonGroup;
    导入javax.swing.ImageIcon;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    导入javax.swing.JRadioButton;
    导入javax.swing.JScrollPane;
    导入javax.swing.SwingUtilities;
    导入javax.swing.border.EtchedBorder;
    导入javax.swing.border.TitledBorder;
    公共类ImageDisplay实现可运行{
    私有项侦听器;
    私有JFrame;
    私人JLabel titleLabel;
    专用JLabel图像标签;
    私有JLabel描述标签;
    私有列表图像;
    公共静态void main(字符串[]args){
    SwingUtilities.invokeLater(newimagedisplay());
    }
    公共图像显示(){
    this.images=setImageInformation();
    }
    @凌驾
    公开募捐{
    帧=新的JFrame(“图像显示”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    添加(createControlPanel(),BorderLayout.WEST);
    frame.add(createImagePanel(),BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
    }
    私有JPanel createImagePanel(){
    JPanel imagePanel=新的JPanel();
    setLayout(新的BorderLayout());
    ImageInformation defaultImageInformation=images.get(0);
    titleLabel=newjlabel(defaultImageInformation.getTitle());
    标题标签设置水平对齐(标签中心);
    imagePanel.add(标题标签,BorderLayout.NORTH);
    imageLabel=新的JLabel(新的ImageIcon(
    defaultImageInformation.getImage());
    JScrollPane scrollPane=新的JScrollPane(图像标签);
    添加(滚动窗格,BorderLayout.CENTER);
    descriptionLabel=新的JLabel(defaultImageInformation.getDescription());
    描述标签设置水平对齐(JLabel.CENTER);
    imagePanel.add(描述标签,BorderLayout.SOUTH);
    返回面板;
    }
    私有JPanel createControlPanel(){
    JPanel面板=新的JPanel();
    面板.设置顺序(新标题边框(新蚀刻边框(),“图像”);
    panel.setLayout(新的GridLayout(0,1));
    ButtonGroup=新建ButtonGroup();
    listener=新的ImageListener();
    对于(int i=0;ipublic class Image {
    public static Render floor = loadBitmap("/Images/sample2.jpg");
    
    public static Render loadBitmap(String fileName){
        try{
            BufferedImage image = ImageIO.read(Image.class.getResource(fileName));
            int width = image.getWidth();
            int height = image.getHeight();
            Render result = new Render(width, height);
            image.getRGB(0, 0, width, height, result.pixels, 0 ,width);
            return result;
        }catch(Exception e){
            System.out.println("crash");
            throw new RuntimeException(e);
    
        }
    }
    
    }
    
    public void render(){
        for(int i =0 ; i <width*height;i++){
            pixels[i]= Image.floor.pixels[i];
        }
    
        test.drawRainbow();
        draw(test,0,0);
    }
    
    package com.ggl.testing;
    
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.SwingUtilities;
    import javax.swing.border.EtchedBorder;
    import javax.swing.border.TitledBorder;
    
    public class ImageDisplay implements Runnable {
    
        private ItemListener listener;
    
        private JFrame frame;
    
        private JLabel titleLabel;
        private JLabel imageLabel;
        private JLabel descriptionLabel;
    
        private List<ImageInformation> images;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new ImageDisplay());
        }
    
        public ImageDisplay() {
            this.images = setImageInformation();
        }
    
        @Override
        public void run() {
            frame = new JFrame("Image Display");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.add(createControlPanel(), BorderLayout.WEST);
            frame.add(createImagePanel(), BorderLayout.CENTER);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        private JPanel createImagePanel() {
            JPanel imagePanel = new JPanel();
            imagePanel.setLayout(new BorderLayout());
    
            ImageInformation defaultImageInformation = images.get(0);
    
            titleLabel = new JLabel(defaultImageInformation.getTitle());
            titleLabel.setHorizontalAlignment(JLabel.CENTER);
            imagePanel.add(titleLabel, BorderLayout.NORTH);
    
            imageLabel = new JLabel(new ImageIcon(
                    defaultImageInformation.getImage()));
            JScrollPane scrollPane = new JScrollPane(imageLabel);
            imagePanel.add(scrollPane, BorderLayout.CENTER);
    
            descriptionLabel = new JLabel(defaultImageInformation.getDescription());
            descriptionLabel.setHorizontalAlignment(JLabel.CENTER);
            imagePanel.add(descriptionLabel, BorderLayout.SOUTH);
            return imagePanel;
        }
    
        private JPanel createControlPanel() {
            JPanel panel = new JPanel();
            panel.setBorder(new TitledBorder(new EtchedBorder(), "Images"));
            panel.setLayout(new GridLayout(0, 1));
    
            ButtonGroup group = new ButtonGroup();
    
            listener = new ImageListener();
    
            for (int i = 0; i < images.size(); i++) {
                ImageInformation imageInformation = images.get(i);
                JRadioButton button = new JRadioButton(imageInformation.getTitle());
                if (i == 0) {
                    button.setSelected(true);
                }
                button.addItemListener(listener);
                group.add(button);
                panel.add(button);
            }
    
            return panel;
        }
    
        private List<ImageInformation> setImageInformation() {
            List<ImageInformation> images = new ArrayList<ImageInformation>();
    
            // Here, you would get your images
            Image image1 = getImage("http://4.bp.blogspot.com/-vfRL5DamWFs/"
                    + "T2nn6D_EUfI/AAAAAAAABB8/Kc9Y33qYWJo/s1600/People-Power.jpg");
            Image image2 = getImage("http://www.jeffjonesillustration.com/images/"
                    + "illustration/00601-group-of-people.jpg");
            Image image3 = getImage("http://www.careersusa.com/portals/0/BusinessPeopleImage2.png");
            Image image4 = getImage("http://www.druginfo.sl.nsw.gov.au/images/teens.jpg");
            Image image5 = getImage("http://www.pesconsulting.co.uk/wp-content/uploads/"
                    + "2013/03/kevin-thom-2010-people-collage.jpg");
            Image image6 = getImage("http://www.emcdda.europa.eu/attachements.cfm/"
                    + "att_77302_EN_young-people-480px.jpg");
    
            images.add(new ImageInformation(image1, "Image 1",
                    "Image 1 Description"));
            images.add(new ImageInformation(image2, "Image 2",
                    "Image 2 Description"));
            images.add(new ImageInformation(image3, "Image 3",
                    "Image 3 Description"));
            images.add(new ImageInformation(image4, "Image 4",
                    "Image 4 Description"));
            images.add(new ImageInformation(image5, "Image 5",
                    "Image 5 Description"));
            images.add(new ImageInformation(image6, "Image 6",
                    "Image 6 Description"));
    
            return images;
        }
    
        private Image getImage(String fileName) {
            try {
                return ImageIO.read(new URL(fileName));
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        private ImageInformation getImageInformation(String title) {
            for (ImageInformation imageInformation : images) {
                if (title.equals(imageInformation.getTitle())) {
                    return imageInformation;
                }
            }
    
            return null;
        }
    
        public class ImageListener implements ItemListener {
    
            @Override
            public void itemStateChanged(ItemEvent event) {
                if (event.getStateChange() == ItemEvent.SELECTED) {
                    JRadioButton button = (JRadioButton) event.getItem();
                    String labelText = button.getText();
                    ImageInformation imageInformation = getImageInformation(labelText);
                    if (imageInformation != null) {
                        titleLabel.setText(imageInformation.getTitle());
                        imageLabel.setIcon(new ImageIcon(imageInformation
                                .getImage()));
                        descriptionLabel.setText(imageInformation.getDescription());
                    }
                }
            }
    
        }
    
        public class ImageInformation {
    
            private final Image image;
    
            private final String title;
            private final String description;
    
            public ImageInformation(Image image, String title, String description) {
                this.image = image;
                this.title = title;
                this.description = description;
            }
    
            public Image getImage() {
                return image;
            }
    
            public String getTitle() {
                return title;
            }
    
            public String getDescription() {
                return description;
            }
    
        }
    }