-4

私はswing Javaアプリケーションが初めてで、ボタンをクリックするたびに実行時にjlabelsを作成する小さなデスクトップアプリケーションを開発しています。

問題は、jlabels の数が多すぎる場合です。jframe にスクロールを表示して、ユーザーがすべての jlabels (jframe の高さの後に作成された jlabel) を表示できるようにする必要があります。

jscrollペインとjscrollバーを試しましたが、使用できません。完全な例を提供してください。

よろしくお願いいたします。

4

1 に答える 1

2

私にとってはうまくいくようです。特定の問題を示すためにSSCCEを投稿してくださいJLabelJScrollPane

ここに画像の説明を入力

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);
            }
        });
    }
}

アップデート

私はあなたが言うのを見ます:

(jframe の高さの後に作成された jlabel)。

だから私はJFrameが見えると思いますか? もしそうなら:

を表示してから 2 秒後に に追加JLabelする方法を示す例を次に示します。最も重要なのは、コンポーネントのサイズを追加/削除/変更した後、コンテナ インスタンスでandを呼び出すことです。JScrollPaneJFramerevalidate()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();
            }
        });
    }
}
于 2012-12-27T12:06:31.340 に答える