Java 使用GridBagLayout和JScrollPane创建Instagram类型的提要
如何在Swing中使用GridBagLayout和JScrollPane创建Instagram类型的提要 oki所以我正在尝试创建一个类似于instagram feed的图库,三张图片并排显示,行数可以尽可能多 我尝试将gridbag布局添加到jpanel中,然后将这个jpanel添加到jscrollpane中 //只是代码的主要部分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
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将调整大小以适应可见部分