Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使可滚动的JPanel显示jLabel_Java_Swing_Jpanel_Jlabel_Jscrollpane - Fatal编程技术网

Java 如何使可滚动的JPanel显示jLabel

Java 如何使可滚动的JPanel显示jLabel,java,swing,jpanel,jlabel,jscrollpane,Java,Swing,Jpanel,Jlabel,Jscrollpane,我有一个jlabel列表,它们是280 x 50,包含文本。我想创建280 x 300JPanel,将所有标签添加到其中并使其可滚动(因为我们可以有6个以上的标签) 我不知道如何在这个特定大小的面板上添加6个以上的标签,也不知道如何使其可滚动(我尝试将面板添加到相同大小的JScrollPane,但实际上什么都没有发生)。有没有办法做到这一点?首先,不要再尝试用部件的尺寸来拧紧。Swing已经有了一个非常强大的布局管理器API,它考虑了GUI框架的许多不同方面以及平台和硬件的差异,让它来完成它的工

我有一个
jlabel
列表,它们是280 x 50,包含文本。我想创建280 x 300
JPanel
,将所有标签添加到其中并使其可滚动(因为我们可以有6个以上的标签)


我不知道如何在这个特定大小的面板上添加6个以上的标签,也不知道如何使其可滚动(我尝试将面板添加到相同大小的
JScrollPane
,但实际上什么都没有发生)。有没有办法做到这一点?

首先,不要再尝试用部件的尺寸来拧紧。Swing已经有了一个非常强大的布局管理器API,它考虑了GUI框架的许多不同方面以及平台和硬件的差异,让它来完成它的工作

JScrollPane
取决于它的内容。它能够独立于
JScrollPane
的大小来计算它的大小,只有这样它才能决定何时显示滚动条。这也适用于
JPanel
。它的大小应根据其内容物的总体要求计算。奇怪的是,如果您使用layout manager API,所有这些都是免费完成的

所以,一个快速的、令人讨厌的例子可能看起来像

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {
    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(new TestPane()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            for (int index = 0; index < 600; index++) {
                JLabel label = new JLabel("This is test " + index);
                // This is for demonstration purposes only
                // you should let the lable calculate its size based on its text
                // and image properties
                label.setPreferredSize(new Dimension(280, 50));
                add(label, gbc);
            }
        }

    }
}
但是
这一切都提出了一个问题:为什么?为什么不直接使用一个
JList
JTable
来完成这一切呢?

首先,停止使用容器的尺寸。容器的大小需要根据其内容进行动态计算,只有这样,
JScrollPane
才能正常工作。我确实想知道JScrollPane中的JList是否是您真正需要的。JList可以像一个JLabel网格一样工作,效率更高。我需要JLabel,因为我需要280x50个矩形,可以在进入时更改背景(用于我的程序设计)。它们包含图像和文本。我不确定
JList
JTable
是否允许我继续我的设计。可能有办法做到这一点,但我还没有清醒到去思考它
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(new TestPane()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel implements Scrollable {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            for (int index = 0; index < 600; index++) {
                JLabel label = new JLabel("This is test " + index);
                // This is for demonstration purposes only
                // you should let the lable calculate its size based on its text
                // and image properties
                label.setPreferredSize(new Dimension(280, 50));
                add(label, gbc);
            }
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(290, 300);
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 128;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 128;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return true;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return true;
        }

    }
}