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