Swing桌面java应用程序滚动

Swing桌面java应用程序滚动,java,swing,scroll,Java,Swing,Scroll,我是swing java应用程序的新手,我正在开发一个小型桌面应用程序,它在运行时通过单击每个按钮创建JLabel 问题是当jlabel编号太多时,我需要在jframe中显示一个滚动条,以便用户能够看到所有jlabel(jlabel在jframe高度之后创建) 我尝试了jscroll窗格和jscroll栏,但没有用,请提供一个完整的示例 提前感谢您的努力。对我来说似乎很有效,请发表文章说明具体问题,我唯一想到的是您将您JLabel添加到容器中,而不是JScrollPane import java

我是swing java应用程序的新手,我正在开发一个小型桌面应用程序,它在运行时通过单击每个按钮创建JLabel

问题是当jlabel编号太多时,我需要在jframe中显示一个滚动条,以便用户能够看到所有jlabel(jlabel在jframe高度之后创建)


我尝试了jscroll窗格和jscroll栏,但没有用,请提供一个完整的示例


提前感谢您的努力。

对我来说似乎很有效,请发表文章说明具体问题,我唯一想到的是您将您
JLabel
添加到容器中,而不是
JScrollPane

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class JLabelJScrollPaneTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame() {
                    @Override
                    public Dimension getPreferredSize() {//size frame purposefully smaller
                        return new Dimension(100, 100);
                    }
                };
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JLabel label = new JLabel("WWWWWWWWWoooooorrrrkkkk");
                JScrollPane jsp = new JScrollPane(label);

                frame.add(jsp);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

更新

我看到你说:

(jlabel在jframe高度之后创建)

所以我认为JFrame是可见的?如果是:

下面的示例演示了如何在显示
JFrame
2秒钟后,将
JLabel
添加到
JScrollPane
,最重要的是在添加/删除/更改组件大小后,在容器实例上调用
revalidate()
repaint()

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class JLabelJScrollPaneTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(100, 100);
                    }
                };
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final JScrollPane jsp = new JScrollPane();
                frame.add(jsp);
                frame.pack();
                frame.setVisible(true);

               Timer t= new Timer(2000, new AbstractAction() {//create timer to add JLabel to scrollPane after 2 seconds
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        final JLabel label = new JLabel("WWWWWWWWWoooooorrrrkkkk");
                        jsp.setViewportView(label);
                        //refelect changes
                        frame.revalidate();
                        frame.repaint();
                    }
                });
                t.setRepeats(false);
                t.start();
            }
        });
    }
}
UPADTE 2

根据评论,完全相同,只是有一些小改动:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class JLabelJScrollPaneTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(100, 100);
                    }
                };
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final JPanel labelPanel = new JPanel(new GridLayout(4, 1));

                final JScrollPane jsp = new JScrollPane(labelPanel);
                frame.add(jsp);
                frame.pack();
                frame.setVisible(true);

                Timer t = new Timer(2000, new AbstractAction() {//create timer to add JLabel to scrollPane after 2 seconds
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        final JLabel label = new JLabel("WWWWWWWWWoooooorrrrkkkk");
                        final JLabel label2 = new JLabel("Try it");
                        final JLabel label3 = new JLabel("Noooooo reealllly");
                        final JLabel label4 = new JLabel("Yes");
                        labelPanel.add(label);
                        labelPanel.add(label2);
                        labelPanel.add(label3);
                        labelPanel.add(label4);
                        labelPanel.revalidate();
                        labelPanel.repaint();
                    }
                });
                t.setRepeats(false);
                t.start();
            }
        });
    }
}

“请提供一个完整的例子”:)鱼不想要如何钓鱼的知识:)我认为在这种情况下,成为一名优秀的程序员需要更长的时间<代码>“请提供一个完整的示例”——拜托,这里不是这样的。请展示您所做的工作,让我们一起来做。感谢您的回答,但我需要为添加到中的多个jLabel添加垂直滚动runtime@user1931998见更新2。你所需要做的就是修改代码……。来吧,戴夫,@user1931998似乎想要一个完整的例子。@HovercraftFullOfEels-Hehe,哦,我明白了,对不起,我的读心技能不符合要求:P