java - 在 actionPerformed() 方法中将项目添加到 ArrayList 中

标签 java swing arraylist

我正在尝试使用 Java Swing 编写图片查看器应用程序。我的小应用程序有一个 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();
        }
    });
}
}

最佳答案

这是一些适合我的代码。有多项代码优化。

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 - 在 actionPerformed() 方法中将项目添加到 ArrayList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49822604/

相关文章:

java - 有什么比从末端迭代 ArrayList 更快的吗?

android - ArrayList & contains() - 不区分大小写

Java ArrayList 克隆改进了运行时

java - RazorSQL 不工作?

java - 将大数据存储在字符串中并将其分配给 TextView ?

java - NetBeans 更改 Ant 版本

java - JVM GC 工作很奇怪

java - 我想显示数组列表中的元素,而不是哈希码

Java - 是否可以将图像和字符串放在同一个 JTable 单元格中?

java - 内存/注意力游戏问题