在Java Swing中使用特定JButton的容器上的垂直滚动

时间:2013-12-04 19:52:19

标签: java swing jscrollpane

欢迎,java-swing程序员。 我想告诉你我最近的问题,因为我一次又一次地追逐着我的尾巴。我用JPanel容器创建了简单的JFrame(我也尝试了JList)。在这里,我使用BoxLayout和一堆JButton,它们是垂直对齐的,就像我想要的一样。

这就出现了问题:框架需要滚动,但只需要垂直框架。我希望看到没有水平滚动的按钮的完全可压缩名称,只是垂直滚动。它们中的文本仍然应该换行,并且当帧较薄时,垂直滚动应该使其自身更长。简单地向JScrollPane添加容器会使按钮失去其标题包装能力,并出现不希望的水平滚动。值得一提的是,按钮的文本将是动态的,并且会根据各种动作进行更改,因此BoxLayout在我看来只是这里的最佳选择。
我想要实现的是类似于效果JTextArea,但是我的JScrollPane不是文本,而是向下/向上滚动按钮。

我没有找到任何简单的解决方案,所有的希望都消失了!我依靠你的技能 先感谢您。在这里你会看到一些代码,因为我的描述可能不够清晰:

import java.awt.*;
import javax.swing.*;

public class Main extends JFrame {

    public Main() {

        setLayout(new GridLayout(0, 1, 10, 10));

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        final JButton tester0 = new JButton("<html>primodial one, the mighty tester of wrapping");
        panel.add(tester0);

        panel.add(new JButton("one"));
        panel.add(new JButton("<html> second one, great knight of the Order of the Didgeridoo"));
        panel.add(new JButton("three"));
        panel.add(new JButton("four"));
        panel.add(new JButton("five"));
        panel.add(new JButton("six"));
        panel.add(new JButton("seven"));
        panel.add(new JButton("eight"));
        panel.add(new JButton("nine"));
        panel.add(new JButton("ten"));
        panel.add(new JButton("eleven"));
        panel.add(new JButton("twelve"));

        add(panel);

//        JScrollPane scroll2 = new JScrollPane(panel);
//        add(scroll2);        
//        final JScrollBar scrollBar1 = scroll2.getVerticalScrollBar();
////        scrollBar1.
    }

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

            public void run() {
                Main frame = new Main();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                //frame.pack();
                frame.setSize(270, 200);
                frame.setVisible(true);
            }
        });
    }

}

祝你好运!

2 个答案:

答案 0 :(得分:2)

听起来你可能想要Wrap Layout,它会根据需要将行换行到下一行。

答案 1 :(得分:1)

为了记录@MadProgrammer给出的好建议,我在此发布结果,所以任何人都可以快速将其与自己的期望进行比较。

Wanted result


在我创建的类比独立类的帮助下(并称之为'Wrap'),我只修改了最后一个构造函数行中的一个:

JScrollPane scroll2 = new JScrollPane(new Wrap(panel));
add(scroll2);        


并完成将html标签添加到每个按钮的名称。 像梦一样工作。