Java 布局管理器和滚动窗格存在一些问题,无法显示对象

Java 布局管理器和滚动窗格存在一些问题,无法显示对象,java,swing,netbeans,jpanel,layout-manager,Java,Swing,Netbeans,Jpanel,Layout Manager,我的申请有问题。我希望动态创建几个“选项卡式”滚动窗格,其中包含称为“ImageLabels”的半大量对象,这些对象只是带有(您猜到了)图像的标签 我的大部分gui都是用Netbeans制作的,因为它是半复杂的,而且我自己也做不到 我的问题是:在添加scrollpane对象(包含带有GridLayout的JPanel)时,以及在尝试将imagelabels添加到带有该布局的JPanel后(我的构造函数被设置为“new GridLayout(0,5,5,5);”这是无限行、5列、5 pxls空间)

我的申请有问题。我希望动态创建几个“选项卡式”滚动窗格,其中包含称为“ImageLabels”的半大量对象,这些对象只是带有(您猜到了)图像的标签

我的大部分gui都是用Netbeans制作的,因为它是半复杂的,而且我自己也做不到

我的问题是:在添加scrollpane对象(包含带有GridLayout的JPanel)时,以及在尝试将imagelabels添加到带有该布局的JPanel后(我的构造函数被设置为“new GridLayout(0,5,5,5);”这是无限行、5列、5 pxls空间)。没有显示任何内容,scrollpanel也没有进入“scroll”模式

我完全不知所措,整天都在尝试不同的布局。这是我的一些代码

ImageLabel对象的构造函数

addMouseListener(this);
setVisible(true);
setPreferredSize(new Dimension(32, 32));
如何设置tileHolderPanel JPanel(保存图像标签的面板)

在构建了我希望添加到每个面板的所有ImageLabel之后,我只需这样做

tileHolderPanel.add(label);
如果重要的话,我的TileHolderPanel位于JPanel中的滚动窗格中,它们具有Netbeans生成的默认GroupLayouts

谢谢,, -卢克

我希望动态创建

将组件添加到可见GUI时,基本代码应为:

panel.add(...);
panel.revalidate();

如果您需要更多帮助,那么您需要发布一个。

下面是一个工作示例,可以与您的代码进行比较

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/** @see http://stackoverflow.com/questions/7801870 */
public class ScrollGroup extends JPanel {

    private static final int N = 8;
    private static final int NN = N * N;
    private static final int GAP = 5;
    private static final int SIZE = 32;

    public ScrollGroup() {
        this.setLayout(new GridLayout(N, N, GAP, GAP));
        for (int i = 0; i < NN; i++) {
            JLabel label = new JLabel();
            label.setOpaque(true);
            label.setBackground(Color.getHSBColor((float) i / NN, 1, 1));
            label.setPreferredSize(new Dimension(SIZE, SIZE));
            this.add(label);
        }
    }

    private void display() {
        JFrame f = new JFrame("ScrollGroup");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane sp = new JScrollPane(this);
        GroupLayout layout = new GroupLayout(f.getContentPane());
        f.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup().addComponent(sp)));
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup().addComponent(sp)));
        f.pack();
        f.setSize(N * SIZE, N * SIZE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ScrollGroup().display();
            }
        });
    }
}

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入javax.swing.GroupLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
/**@见http://stackoverflow.com/questions/7801870 */
公共类ScrollGroup扩展了JPanel{
专用静态最终整数N=8;
私有静态最终整数NN=N*N;
专用静态最终内部间隙=5;
私有静态最终整数大小=32;
公共组(){
这个.setLayout(新的GridLayout(N,N,GAP,GAP));
对于(int i=0;i
在这种情况下,
GroupLayout
的行为类似于
BorderLayout.CENTER
。如果NetBeans的GUI设计器让你慢下来了,那就放弃它,花点时间学习布局。今天晚些时候我将尝试一下。除了使用GroupLayout和GridLayout之外,我不确定我做了什么不同。我们拭目以待。提前感谢,无论这是否有助于我解决问题,这都很有帮助。:)不客气。我在框架中使用了
GroupLayout
,以模拟NetBeans GUI设计器的默认设置。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/** @see http://stackoverflow.com/questions/7801870 */
public class ScrollGroup extends JPanel {

    private static final int N = 8;
    private static final int NN = N * N;
    private static final int GAP = 5;
    private static final int SIZE = 32;

    public ScrollGroup() {
        this.setLayout(new GridLayout(N, N, GAP, GAP));
        for (int i = 0; i < NN; i++) {
            JLabel label = new JLabel();
            label.setOpaque(true);
            label.setBackground(Color.getHSBColor((float) i / NN, 1, 1));
            label.setPreferredSize(new Dimension(SIZE, SIZE));
            this.add(label);
        }
    }

    private void display() {
        JFrame f = new JFrame("ScrollGroup");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane sp = new JScrollPane(this);
        GroupLayout layout = new GroupLayout(f.getContentPane());
        f.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup().addComponent(sp)));
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup().addComponent(sp)));
        f.pack();
        f.setSize(N * SIZE, N * SIZE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ScrollGroup().display();
            }
        });
    }
}