Создайте фид типа Instagram, используя GridBagLayout & JScrollPane - PullRequest
0 голосов
/ 14 апреля 2019

Как создать фид типа Instagram, используя GridBagLayout и JScrollPane в Swing?

oki, поэтому я пытаюсь создать галерею, похожую на фид instagram (три изображения рядомстороны и ряды могут быть как можно больше).

Я попытался сделать это, используя компоновку 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..etc - это мои метки изображений, настроенные на мои предпочтительные размеры

    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);

это не получилось, как ожидалось, каждый раз, когда я добавляю больше изображений вместо использования пробела, чтобы прокрутить внизчтобы увидеть изображения, не видимые в видимом пространстве, он сжимает другие изображения, чтобы поместить их все в одно и то же видимое пространство.

1 Ответ

0 голосов
/ 14 апреля 2019

Почему вы пытаетесь использовать 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);
        }
    }
}

Надеюсь, это поможет, скажите мне, если я неправильно понял идею.

...