Java 将项目添加到actionPerformed()方法内的ArrayList中

Java 将项目添加到actionPerformed()方法内的ArrayList中,java,swing,arraylist,Java,Swing,Arraylist,我正在尝试使用JavaSwing编写一个图片查看器应用程序。我的小应用程序有一个JMenuItemimportItem,用于选择图像。此应用程序中的问题。当你只添加一张图片时,它不会显示,所以你应该添加两张或更多的图片。我认为问题出在importItemactionPerformed()方法中,但我不知道它到底在哪里 知道怎么修吗 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.

我正在尝试使用JavaSwing编写一个图片查看器应用程序。我的小应用程序有一个
JMenuItem
importItem
,用于选择图像。此应用程序中的问题。当你只添加一张图片时,它不会显示,所以你应该添加两张或更多的图片。我认为问题出在
importItem
actionPerformed()
方法中,但我不知道它到底在哪里

知道怎么修吗

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class MainFrame2 extends JFrame implements ActionListener{
private JPanel northPanel,principalPanel,centerPanel;
private JButton nextButton,previousButton;
private int counter = 1;
private JFileChooser jFileChooser;
private ArrayList<JPanel> picturesPanels;
private ArrayList<BufferedImage> pictures;

public MainFrame2() {
    setSize(600,600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    northPanel = new JPanel(new FlowLayout());
    nextButton = new JButton(">>");
    nextButton.addActionListener(this);
    previousButton = new JButton("<<");
    previousButton.addActionListener(this);
    northPanel.add(previousButton);
    northPanel.add(nextButton);

    picturesPanels = new ArrayList<>();
    pictures = new ArrayList<>();

    centerPanel = new JPanel(new CardLayout());
    principalPanel = new JPanel(new BorderLayout());
    principalPanel.add(northPanel,BorderLayout.NORTH);
    principalPanel.add(centerPanel,BorderLayout.CENTER);
    setContentPane(principalPanel);
    setJMenuBar(myMenu());

    jFileChooser = new JFileChooser();
    //jFileChooser.setFileFilter(new PictureFilter());
    jFileChooser.setMultiSelectionEnabled(true);

    setMinimumSize(new Dimension(300,300));
    setVisible(true);
}

private JMenuBar myMenu() {
    JMenuBar jMenuBar = new JMenuBar();
    JMenu fileMenu = new JMenu("File");
    JMenuItem importItem = new JMenuItem("Import pictures");
    fileMenu.add(importItem);
    ////////////////Setting Up importItem///////////////////
    importItem.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (jFileChooser.showOpenDialog(MainFrame2.this)
                    == JFileChooser.APPROVE_OPTION) {
                File [] files = jFileChooser.getSelectedFiles();
                for (int i=0;i<files.length;i++) {
                    try {
                        pictures.add(ImageIO.read(new 
                File(files[i].getPath())));
                    } catch (IOException e1) {
                        System.out.println("Error loading image");
                    }
                }
                picturesPanels.clear();
                for (BufferedImage image:pictures) {
                    picturesPanels.add(new JPanel() {
                        @Override
                        protected void paintComponent(Graphics g) {
                            super.paintComponent(g);
                            int original_width = image.getWidth();
                            int original_height = image.getHeight();
                            int bound_width = getWidth();
                            int bound_height = getHeight();
                            int new_width = original_width;
                            int new_height = original_height;

                            if (original_width > bound_width) {
                                new_width = bound_width;
                                new_height = (new_width * original_height) / 
          original_width;
                            }
                            if (new_height > bound_height) {
                                new_height = bound_height;
                                new_width = (new_height * original_width)/ 
          original_height;
                            }
                            g.drawImage(image,(getWidth()-new_width)/2
                                    ,(getHeight()- 
            new_height)/2,new_width,new_height,this);
                        }
                    });
                }
                for (int i=0;i<picturesPanels.size();i++) {
                    centerPanel.add(picturesPanels.get(i),""+(i+1));
                }
            }
        }
    });
    jMenuBar.add(fileMenu);
    return jMenuBar;
}

@Override
public void actionPerformed(ActionEvent e) {
    CardLayout cardLayout = (CardLayout)centerPanel.getLayout();
    if (e.getSource() == nextButton) {
        counter++;
        if (counter>pictures.size()) {
            counter = 1;
        }
        cardLayout.show(centerPanel,""+counter);
    }
    if (e.getSource() == previousButton) {
        counter--;
        if (counter<1) {
            counter = pictures.size();
        }
        cardLayout.show(centerPanel,""+counter);
    }
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new MainFrame2();
        }
    });
}
}
导入javax.imageio.imageio;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
公共类MainFrame2扩展JFrame实现ActionListener{
私人JPanel northPanel、principalPanel、centerPanel;
私有JButton nextButton、previousButton;
专用整数计数器=1;
私有JFileChooser JFileChooser;
私人ArrayList图片面板;
私人ArrayList图片;
公共主框架2(){
设置大小(600600);
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
northPanel=newJPanel(newFlowLayout());
nextButton=新的JButton(“>>”);
addActionListener(这个);

previousButton=newjbutton(“以下是一些适合我的代码。有几个代码优化

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ImageLoaderTest extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JButton nextButton, previousButton;
    private CardLayout cards = new CardLayout();
    private JPanel centerPanel = new JPanel(cards);
    private JFileChooser jFileChooser;

    public ImageLoaderTest() {
        setSize(600, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel northPanel = new JPanel(new FlowLayout());
        nextButton = new JButton(">>");
        nextButton.addActionListener(this);
        previousButton = new JButton("<<");
        previousButton.addActionListener(this);
        northPanel.add(previousButton);
        northPanel.add(nextButton);

        JPanel principalPanel = new JPanel(new BorderLayout());
        principalPanel.add(northPanel, BorderLayout.NORTH);
        principalPanel.add(centerPanel, BorderLayout.CENTER);
        setContentPane(principalPanel);
        setJMenuBar(myMenu());

        jFileChooser = new JFileChooser();
        // jFileChooser.setFileFilter(new PictureFilter());
        jFileChooser.setMultiSelectionEnabled(true);

        setMinimumSize(new Dimension(300, 300));
        setVisible(true);
    }

    private JMenuBar myMenu() {
        JMenuBar jMenuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem importItem = new JMenuItem("Import pictures");
        fileMenu.add(importItem);
        //////////////// Setting Up importItem///////////////////
        importItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (jFileChooser.showOpenDialog(ImageLoaderTest.this) == JFileChooser.APPROVE_OPTION) {
                    File[] files = jFileChooser.getSelectedFiles();
                    for (int i = 0; i < files.length; i++) {
                        try {
                            BufferedImage image = ImageIO.read(new File(files[i].getPath())); // Assigned image to variable, not needed but makes next line cleaner.
                            centerPanel.add(new PicturePanel(image)); // add the picture directly to the panel, no need to create a list. Also used a custom PicturePanel
                            cards.next(centerPanel); // automatically press the next button so that we see the picture loaded.
                        } catch (IOException e1) {
                            System.out.println("Error loading image");
                        }
                    }
                }
            }
        });
        jMenuBar.add(fileMenu);
        return jMenuBar;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == nextButton) {
            cards.next(centerPanel); // cleaned up code. No need to implement a counter when .next() will do. Unless you want to jump around
        }
        if (e.getSource() == previousButton) {
            cards.previous(centerPanel); // cleaned up code. No need to implement a counter when .previous() will do. Unless you want to jump around
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ImageLoaderTest();
            }
        });
    }
}

class PicturePanel extends JPanel {
    private static final long serialVersionUID = 1L;
    protected BufferedImage image = null;

    public PicturePanel(BufferedImage image) {
        super();
        this.image = image;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int original_width = image.getWidth();
        int original_height = image.getHeight();
        int bound_width = getWidth();
        int bound_height = getHeight();
        int new_width = original_width;
        int new_height = original_height;

        if (original_width > bound_width) {
            new_width = bound_width;
            new_height = (new_width * original_height) / original_width;
        }
        if (new_height > bound_height) {
            new_height = bound_height;
            new_width = (new_height * original_width) / original_height;
        }
        g.drawImage(image, (getWidth() - new_width) / 2, (getHeight() - new_height) / 2,
                new_width, new_height, this);
    }
}
导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入javax.imageio.imageio;
导入javax.swing.JButton;
导入javax.swing.JFileChooser;
导入javax.swing.JFrame;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类ImageLoaderTest扩展JFrame实现ActionListener{
私有静态最终长serialVersionUID=1L;
私有JButton nextButton、previousButton;
私人卡布局卡=新卡布局();
专用JPanel中心面板=新JPanel(卡);
私有JFileChooser JFileChooser;
公共ImageLoaderTest(){
设置大小(600600);
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
JPanel-northPanel=newjpanel(newflowlayout());
nextButton=新的JButton(“>>”);
addActionListener(这个);

previousButton=新的JButton(“你是不是只写了一个117字的句子?哈,我只是想解释一下这个问题。我看到的另一件事是,你没有清除
图片
,但是每次用户添加图片时,你都会循环查看
图片
,然后在
图片窗格
中添加一个新的
JPanel
。我认为这会导致重复当你将它们添加到<代码>中心面板< /代码>中时,你没有删除以前的图片,所以可能有多个图片面板,它们的代码相同。<约束> <代码>。age;
类变量并在构造函数中设置它,如
picturePanels.add(new PicturePanel(image));
@bcr666谢谢你,我用相同的
约束解决了多个picturePanels
jus,添加
picturesPanels.clear();
在此循环之前`for(buffereImage:pictures)`