【问题标题】:Display JLabels on a JPanel with fixed width in GridBagLayout在 GridBagLayout 中以固定宽度在 JPanel 上显示 JLabels
【发布时间】:2016-05-09 00:46:54
【问题描述】:

我想显示一个带有两个 JPanel 的 JFrame。为简单起见,我在 JFrame 的右半边实现了一个“占位符”JPanel。 我想在 JFrame 的左侧显示一个 JPanel,即

a) 水平方向不可调整大小(应具有固定宽度)。

b) 左侧 JPanel 的类应该有一个方法,将 JLabel 尽可能放在 JPanel 上(第一个 JLabel 尽可能向上,第二个 JLabel 在第一个 JLabel 下方,第三个 JLabel 在第二个下方,依此类推),最好在左侧 JPanel 的中心。

我的代码是:

public class Test extends JPanel {

     public Test() {
        this.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        this.setBackground(Color.WHITE);
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.weighty = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200,200);
    }

    public void addEntry() {
        JLabel label = new JLabel();
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.weighty = 1;
        gbc.weightx = 1;

        gbc.fill = GridBagConstraints.HORIZONTAL;

        label.setText("Label test");
        this.add(label, gbc);
        this.validate();
    }
}

.

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout(2,1));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Test test = new Test();

    JPanel placeholder = new JPanel();
    placeholder.setPreferredSize(new Dimension(200,200));
    placeholder.setBackground(Color.BLACK);

    frame.add(test, BorderLayout.LINE_START);
    frame.add(placeholder, BorderLayout.CENTER);

    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    test.addEntry();
    test.addEntry();
}

状态:

目前左侧 JPanel 的宽度是固定的,但是 JLabel 是在 JPanel 上垂直添加的,并且也没有放置在 JPanel 的中心。

截图:

http://imgur.com/tvwn7Mc

编辑: 使用 mKorbel 的建议尝试 BoxLayout:

public class Test extends JPanel {
public Test() {
    this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(200,200);
}

public void addEntry() {
    JLabel label = new JLabel();
    label.setText("Label test");
    label.setAlignmentX(Component.CENTER_ALIGNMENT);
    this.add(label);
    this.revalidate();
}

}

【问题讨论】:

    标签: java swing jpanel jlabel gridbaglayout


    【解决方案1】:

    您的 addEntry() 方法使用相同的约束,因此您不会得到您想要的结果。

    您需要创建一个实例变量,假设“row”最初设置为值 0。然后您将组件添加到面板中,x 值为 0,y 值为“row”。在方法结束时,将 row 增加 1,以便下次调用该方法时,y 值将为 1,这将为您提供垂直布局。

    或者另一种选择是使用垂直 BoxLayout。然后你不需要担心网格位置。每次添加组件时,它都会垂直添加。阅读 How to Use Box Layout 上的 Swing 教程部分,了解更多信息和示例。

    【讨论】:

    • 我已按照您的建议使用 BoxLayout 版本编辑了我的帖子。现在很好用。你能告诉我如何实现一个垂直的 ScrollBar 来滚动 .addEntry() 方法的 JLabels 吗?我试图简单地添加一个 JScrollBar,但无法将 ScrollBar 放置在 JPanel 的右端。这可能是由 BoxLayout 引起的?
    • I've tried to simply add a JScrollBar, - 你不使用 JScrollBar。您使用面板作为参数创建一个 JScrollPane。然后将滚动窗格添加到框架中。滚动条会在需要时出现。
    • 刚刚接受了您的回答。我也按照您刚才的建议尝试了它。未显示滚动条(我确实创建了一个 ScrollPane 并将其添加到框架中)。你觉得有什么原因吗?
    • 你没有发布你的代码,所以我看不到你在做什么。但是,滚动条没有理由显示只有两个标签添加到面板。当您向面板添加更多标签并且标签位于滚动窗格的视图之外时,滚动条将自动出现。如果您希望滚动条始终可见,那么您需要阅读 JScrollPane API。您可以设置一个参数以使滚动条即使未处于活动状态也始终可见。
    猜你喜欢
    • 2014-10-28
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多