【问题标题】:How do I put a scrollPane on a BoxLayout?如何在 BoxLayout 上放置 scrollPane?
【发布时间】:2014-07-08 00:17:47
【问题描述】:

我想让我的 JFrame 有一个 BoxLayout 能够有一个滚动窗格,这样我就可以继续添加组,就像它是收据或发票打印机一样。有没有办法添加ScrollPane

问题:如何在 JFrame 中添加 ScrollPane?

代码,原见here

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

/** @see https://stackoverflow.com/a/8504753/230513 */
public class GroupPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private JLabel label1     = new JLabel("Primary:");
    private JTextField field1 = new JTextField(16);
    private JLabel label2     = new JLabel("Secondary:");
    private JTextField field2 = new JTextField(16);
    private JLabel label3     = new JLabel("Tertiary:");
    private JTextField field3 = new JTextField(16);
    JScrollPane sp = new JScrollPane();

    public GroupPanel(int n) {
        this.setBorder(BorderFactory.createTitledBorder("Panel " + n));
        GroupLayout l = new GroupLayout(this);          
        this.setLayout(l);
        l.setAutoCreateGaps(true);
        l.setAutoCreateContainerGaps(true);
        l.setHorizontalGroup(l.createSequentialGroup()
            .addGroup(l.createParallelGroup(GroupLayout.Alignment.TRAILING)
                .addComponent(label1)
                .addComponent(label2)
                .addComponent(label3))
            .addGroup(l.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(field1)
                .addComponent(field2)
                .addComponent(field3))
        );

        l.setVerticalGroup(l.createSequentialGroup()
            .addGroup(l.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label1)
                .addComponent(field1))
            .addGroup(l.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label2)
                .addComponent(field2))
            .addGroup(l.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label3)
                .addComponent(field3))
        );

        sp.setToolTipText("test");
        sp.add(this);
    }

    private static void display() {
        JFrame f = new JFrame("GroupPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));
        f.getContentPane().add(new GroupPanel(1));
        f.getContentPane().add(new GroupPanel(2));
        f.getContentPane().add(new GroupPanel(3));
        f.getContentPane().add(new GroupPanel(4));
        f.getContentPane().add(Box.createVerticalGlue());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                display();
            }
        });
    }
}

【问题讨论】:

    标签: java swing jpanel jscrollpane boxlayout


    【解决方案1】:

    简单地将所有组件先包含在JPanel中,然后将其添加到JScrollPane中,最后将JScrollPane添加到JFrames内容窗格中。

    示例代码:

    JPanel panel = new JPanel();
    JScrollPane scrollPane = new JScrollPane(panel);
    
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.add(new GroupPanel(1));
    panel.add(new GroupPanel(2));
    panel.add(new GroupPanel(3));
    panel.add(new GroupPanel(4));
    panel.add(Box.createVerticalGlue());
    
    f.getContentPane().add(scrollPane);
    

    截图;

    【讨论】:

    • +1 是重构 original 的有用示例。
    • 这很好,但是当按下tab键移动到另一个组件时自动滚动呢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多