JFrame在滚动面板中显示标签

问题描述 投票:0回答:2

我正在制作一个需要在滚动面板中显示标签的框架,但在我添加标签后滚动不起作用。

Example

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scrollPane.setBounds(1, 1, 210, 259);

    panel.add(scrollPane);

    JPanel roomList = new JPanel();
    scrollPane.setViewportView(roomList);
    roomList.setLayout(null);

    int x=0;
    for(String l : list) {
        JLabel c = new JLabel(l+" "+x);
        c.setBounds(new Rectangle(1, 1+x*11, 191, 14));
        roomList.add(c);
        x++;
    }

我确定这个名单超过了22个。

我不知道如何google它!

java swing jlabel jscrollpane
2个回答
4
投票

您的基本问题是,您不了解布局管理API的工作原理,或者在您选择丢弃它时如何替换它的功能。

你的问题从这里开始:

roomList.setLayout(null);

后台有很多工作要为API的各个部分提供大量信息,而从表面上看,布局管理API并不复杂,它所扮演的角色也是如此。

JScrollPane将使用组件的preferredSize来确定何时应显示滚动条。由于你已经完成了这种自动计算,JScrollPane没有任何进展

有关更多信息,请查看Laying Out Components Within a Container

举个简单的例子......

Simple Scroll Example

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);
                JScrollPane scrollPane = new JScrollPane(new TestPane());
                frame.add(scrollPane);
                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.gridx = 0;
            gbc.gridy = 0;

            for (int index = 0; index < 100; index++) {
                add(new JLabel("Row " + index), gbc);
                gbc.gridy++;
            }
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(100, 50);
        }

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

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

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return getPreferredSize().width <= getWidth();
        }

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

    }

}

这个例子实现了Scrollable接口,这并不总是必需的,但是在这个例子中,它用于向JScrollPane提供关于它应该使用的可视区域的首选大小的提示,否则它将尝试使用组件的preferredSize

但是,正如已经提出的那样,您可以使用其他更简单,更优化的解决方案。

如果您的信息足够简单,您可以使用JList以垂直方式列出多个值,有关详细信息,请参阅How to use Lists

如果您的信息结构更复杂,则可以使用JTable,它提供行和列样式结构。有关更多信息,请参阅How to use tables


3
投票

您是否尝试过使用jLists而不是JScrollPanes?

它们非常容易实现,看起来很棒并且像魅力一样工作。

DefaultListModel model = new DefaultListModel();
for(String l : list) {
    model.addElement(l);
}

yourList.setModel(model);

其中list是房间数据的列表,yourList是jList。

© www.soinside.com 2019 - 2024. All rights reserved.