0

我想知道如何制作这样一个图片库:

在此处输入图像描述

我所需要的只是让它像上面那样在 5x5 正方形中显示图像,每个图像都有一个单击事件(我知道如何执行 ActionEvents)

我尝试GridLayout使用构造函数制作a 5, 5,然后添加图像panel.add(image, 0, 0);等等,但无济于事。这是代码:

        imagelayout = new GridLayout(5, 5, 5, 5);

        imagepanel = new JPanel(imagelayout);

        JLabel image = new JLabel(LogoManager.getInstance().getLogo("Apple"));
        JLabel image1 = new JLabel(LogoManager.getInstance().getLogo("McDonalds"));
        JLabel image2 = new JLabel(LogoManager.getInstance().getLogo("Fox"));
        JLabel image3 = new JLabel(LogoManager.getInstance().getLogo("Microsoft"));
        imagepanel.add(image, 0, 0);
        imagepanel.add(image1, 1, 0);
        imagepanel.add(image2, 1, 1);
        imagepanel.add(image3, 2, 0);

这就是我得到的:

在此处输入图像描述

多谢你们!

4

2 回答 2

1

如果你打算做布局,而不是 BorderLayout,做 GridLayout。它从字面上以网格方式设置屏幕上的项目。只需将面板的布局设置为:

    panel.setLayout(new GridLayout(5,5));

这应该会创建您正在寻找的输出。希望这可以帮助!

编辑:

您可以只使用 BASE 面板,并添加一个 JButton 而不是 JLabels。要显示图像,只需执行以下操作:

  JButton image1 = new JButton(new ImageIcon(//apple logo));
  JButton image2 = new JButton(new ImageIcon(//next logo));      
  JButton image3 = new JButton(new ImageIcon(//next logo));     
  JButton image4 = new JButton(new ImageIcon(//next logo));
  JButton image5 = new JButton(new ImageIcon(//next logo));

  panel.setLayout(new GridLayout(5,5));
  panel.add(image1);
  panel.add(image2);
  panel.add(image3);
  panel.add(image4);
  panel.add(image5);

不必担心将图像放在特定位置(当然,除非您有这样做的理由),但是程序已经将图像放置在正确的位置,并按照您将它们添加到面板上的顺序放置它们,所以担心将它们放在特定位置是浪费时间。希望这对你有帮助!

于 2013-05-05T22:09:50.033 回答
1

问题在于add方法的使用

代替

    imagepanel.add(image, 0, 0);
    imagepanel.add(image1, 1, 0);
    imagepanel.add(image2, 1, 1);
    imagepanel.add(image3, 2, 0);

尝试

    imagepanel.add(image);
    imagepanel.add(image1);
    imagepanel.add(image2);
    imagepanel.add(image3);

图像将按添加顺序排列

您尚未显示它,但我建议使用JFrame#pack将框架调整为其内容的首选大小

更新了示例

根据您所追求的效果,您可以通过将其中一个设置为0.

例如,如果您想先按行布局组件(即从左到右,从上到下),将rows参数设置为0将赋予列更多权重/优先级...

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestGrid03 {

    public static void main(String[] args) {
        new TestGrid03();
    }

    public TestGrid03() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridLayout(0, 5, 5, 5));
            File[] files = new File("\path\to\your\images").listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    String name = pathname.getName().toLowerCase();
                    return pathname.isFile() &&
                            name.endsWith(".png") ||
                            name.endsWith(".jpg");
                }
            });
            Arrays.sort(files);
            int count = 0;
            while (count < 6 && count < files.length) {
                try {
                    System.out.println(count + "; " + files[count]);
                    add(new JLabel(new ImageIcon(ImageIO.read(files[count]))));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                count++;
            }
        }
    }

}
于 2013-05-05T22:23:04.910 回答