Java 使用GridBagLayout和JScrollPane创建Instagram类型的提要

Java 使用GridBagLayout和JScrollPane创建Instagram类型的提要,java,swing,awt,jscrollpane,gridbaglayout,Java,Swing,Awt,Jscrollpane,Gridbaglayout,如何在Swing中使用GridBagLayout和JScrollPane创建Instagram类型的提要 oki所以我正在尝试创建一个类似于instagram feed的图库,三张图片并排显示,行数可以尽可能多 我尝试将gridbag布局添加到jpanel中,然后将这个jpanel添加到jscrollpane中 //只是代码的主要部分 rightbottom=new JPanel(); rightbottom.setPreferredSize(new Dime

如何在Swing中使用GridBagLayout和JScrollPane创建Instagram类型的提要

oki所以我正在尝试创建一个类似于instagram feed的图库,三张图片并排显示,行数可以尽可能多

我尝试将gridbag布局添加到jpanel中,然后将这个jpanel添加到jscrollpane中

//只是代码的主要部分

       rightbottom=new JPanel();       
    rightbottom.setPreferredSize(new Dimension(200,200));
    rightbottom.setLayout(new GridBagLayout());
    GridBagConstraints c1=new GridBagConstraints();
    c1.insets = new Insets(1, 1, 1, 1);
    gallery = new JScrollPane(rightbottom);


 gallery.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
//aetherfirst、aethersecond..等是根据我的首选尺寸定制的图像标签

    c1.gridx=0;
    c1.gridy=0;
    c1.weightx=1;
    c1.weighty=1;
    c1.fill = GridBagConstraints.BOTH;

    rightbottom.add(aetherfirst,c1);

    c1.gridx=1;
    c1.gridy=0;
    rightbottom.add(aethersecond,c1);
    c1.gridx=2;
    c1.gridy=0;
    rightbottom.add(aetherthird,c1);
    c1.gridx=0;
    c1.gridy=1;
    rightbottom.add(aetherfourth,c1);
    c1.gridx=1;
    c1.gridy=1;
    rightbottom.add(aetherfifth,c1);
    c1.gridx=2;
    c1.gridy=1;
    rightbottom.add(aethersixth,c1);
    c1.gridx=0;
    c1.gridy=2;
    rightbottom.add(aetherseventh,c1);

它并没有像预期的那样出现,每次我添加更多的图像而不是使用空间,这样我就可以向下滚动查看在可见空间中看不到的图像,它会缩小其他图像以将所有图像都放在同一可见空间中。

为什么要尝试使用GridBagLayout?只需使用FlowLayout水平滚动或GridLayout垂直滚动即可实现

请参见以下示例:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

public class InstaFeedSimulation{

    public static void main(String[] args) {
        JScrollPane flowPanelScrollPane = new JScrollPane(new FlowFeed());
        JFrame flowFrame = new JFrame("Instagram Feed Panel Simulation");
        flowFrame.setBounds(200, 200, 187, 120);
        flowFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        flowFrame.setLayout(new BorderLayout());
        flowFrame.add(flowPanelScrollPane, BorderLayout.CENTER);
        flowFrame.setVisible(true);
        //
        JScrollPane gridPanelScrollPane = new JScrollPane(new GridFeed());
        JFrame gridFrame = new JFrame("Instagram Feed Panel Simulation");
        gridFrame.setBounds(400, 400, 190, 250);
        gridFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        gridFrame.setLayout(new BorderLayout());
        gridFrame.add(gridPanelScrollPane, BorderLayout.CENTER);
        gridFrame.setVisible(true);
    }
}

class FlowFeed extends JPanel{
    private Color[] COLORS = new Color[] {Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN,
              Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED,
              Color.YELLOW, Color.WHITE};

    public FlowFeed() {
        this.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        //
        Random rand = new Random();
        for (int i = 0; i < 28; i++) {
            JPanel aPanel = new JPanel();
            aPanel.setPreferredSize(new Dimension(50, 50));
            aPanel.setBackground(COLORS[rand.nextInt(COLORS.length)]);
            this.add(aPanel);
        }
    }
}

class GridFeed extends JPanel{
    private Color[] COLORS = new Color[] {Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN,
                                  Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED,
                                  Color.YELLOW, Color.WHITE};
    public GridFeed() {
        this.setLayout(new GridLayout(10,3,3,3));
        //
        Random rand = new Random();
        for (int i = 0; i < 28; i++) {
            JPanel aPanel = new JPanel();
            aPanel.setPreferredSize(new Dimension(50, 50));
            aPanel.setBackground(COLORS[rand.nextInt(COLORS.length)]);
            this.add(aPanel);
        }
    }
}

希望这能有所帮助,如果我的想法有误,请告诉我。

为什么要尝试使用GridBagLayout?只需使用FlowLayout或GridLayout即可实现。没有理由为这两种用例扩展JPanel。直接构造一个JPanel并设置它的布局。@VGR:你说得对,对于这个简单的例子,没有必要扩展JPanel。我只是建议,FeedPanel可以是JPanel的子产品,它可以封装此类面板的所有必要功能和属性,包括布局管理、进一步的事件处理和未来的事件传播。非常感谢,您的代码实现了我希望它做的,但是,我希望大小是动态的,这样,如果我以后添加更多的图像,我也可以修改,如果图像较少,我以前在使用grid layout时注意到,出于某种原因,它没有保留3列。例如,当我在提要中添加了4个图像,而不是第一行中的3个和第二行中的1个时,它变成了每行中的2个。对于这一点仍然是新的,所以尝试理解谢谢这一点对于放在jlabel中的图像是有效的,因为某些原因jlabel将调整大小以适应可见部分