java - 我想在具有面板 ArrayList 的 ScrollPane 中使用 BoxLayout

标签 java swing jpanel boxlayout

当我将外面板设置为 BoxLayout 时,面板就会消失。但是,滚动条显示表明 ArrayList 中的面板位于正确的位置。 我对 Java 完全陌生,所以我将不胜感激任何评论。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.*;
import javax.swing.*;

public class gui extends JFrame{

    int ctr=0, top=5;
    public List<JPanel> o_panels = new ArrayList<JPanel>(); //Your List    

    public gui(){
        super("MCC");
        setLayout(null);
        //Output panel for the results
        JPanel outpanel = new JPanel();
        outpanel.setBackground(Color.blue); 
        outpanel.setVisible(true);
        outpanel.setLayout(new BoxLayout(outpanel, BoxLayout.PAGE_AXIS));           
        //Scroll pane
        JScrollPane scrollPane = new JScrollPane(outpanel,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);            
        scrollPane.setBounds(0,0,780,400);
        add(scrollPane);            
        //result panel
        //creating and adding panels in to the array list
        while(ctr<=4){
            JPanel label1 = new JPanel();
            label1.setPreferredSize(new Dimension(600,100));
            o_panels.add(label1);
            outpanel.add(o_panels.get(ctr));        
        ctr++;
        }
    }

    public void runGui(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800,600);
        this.setVisible(true);
        this.setResizable(false);
        //i call this on the other class
    }
}

最佳答案

您的代码没有太大问题,问题是,您没有建立任何方法来查看您所添加的内容

看看这个...

while (ctr <= 4) {
    JPanel label1 = new JPanel();
    label1.setPreferredSize(new Dimension(600, 100));
    o_panels.add(label1);
    outpanel.add(o_panels.get(ctr));
    ctr++;
}

所有面板都是相同的颜色,并且您没有向它们添加任何内容,所以您怎么可能知道它们是否已添加或布局正确...

我简单地添加了 label1.setBorder(new LineBorder(Color.RED)); 并得到了这个结果...

Panels

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Test extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                Test test = new Test();
                test.runGui();
            }
        });
    }

    int ctr = 0, top = 5;

    public List<JPanel> o_panels = new ArrayList<JPanel>(); //Your List

    public Test() {
        super("MCC");
        //Output panel for the results
        JPanel outpanel = new JPanel();
        outpanel.setBackground(Color.blue);
        outpanel.setVisible(true);
        outpanel.setLayout(new BoxLayout(outpanel, BoxLayout.PAGE_AXIS));

        //Scroll pane
        JScrollPane scrollPane = new JScrollPane(outpanel,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        scrollPane.setBounds(0, 0, 780, 400);
        add(scrollPane);

    //result panel
        //creating and adding panels in to the array list
        while (ctr <= 4) {
            JPanel label1 = new JPanel();
            label1.setPreferredSize(new Dimension(600, 100));
            label1.setBorder(new LineBorder(Color.RED));
            o_panels.add(label1);
            outpanel.add(o_panels.get(ctr));
            ctr++;
        }
    }

    public void runGui() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        this.setVisible(true);
//        this.setResizable(false);
        setLocationRelativeTo(null);
    }
}

另请查看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

你真的应该避免使用 null 布局,像素完美布局是现代 UI 设计中的一种幻觉。影响组件个体尺寸的因素太多,您无法控制其中任何一个。 Swing 的设计初衷是与布局管理器一起工作,放弃它们将导致无穷无尽的问题,您将花费越来越多的时间来尝试纠正

关于java - 我想在具有面板 ArrayList 的 ScrollPane 中使用 BoxLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25194572/

相关文章:

java - 在 JeroMQ 中将文件作为消息发送

java - 当我的 JFrame 恢复(取消图标)时,如何重新绘制内容?

Java JDialogs之间如何传递信息?

java - JPanel 可能重叠?

java - 基于其paintComponent的可滚动JPanel

java - 使用Gradle引用其他Eclipse项目

java - 为什么 "jdk6/javac -cp .:dependentJarCompiledWith1.7.jar Target.java"工作正常?

java - Spring Security不通过Spring Session EnableRedisHttpSession重用身份验证数据

Java鼠标事件右键单击

java - 将 JLabel 添加到 JPanel