【问题标题】:Arrange JPanels in top of a ScrollPane, not centered将 JPanel 排列在 ScrollPane 的顶部,而不是居中
【发布时间】:2014-07-31 11:26:10
【问题描述】:

以下代码将我的问题重现为SSCCE。我想在JScrollPane 中创建JPanels 的垂直可滚动列表。我的实际代码将JPanels 对齐在中心,但它应该在顶部对齐。 我该怎么做,感谢任何帮助。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestingWindow {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setBounds(100, 100, 150, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JScrollPane scrollPane = new JScrollPane();
                frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

                JPanel panel = new JPanel();
                GridBagLayout gbl_panel = new GridBagLayout();
                panel.setLayout(gbl_panel);
                scrollPane.setViewportView(panel);

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.anchor = GridBagConstraints.NORTH;
                gbc.weightx = 1;

                gbc.fill = GridBagConstraints.HORIZONTAL;

                JPanel panelToAdd = new JPanel();
                JLabel label = new JLabel("Test 1");
                panelToAdd.setBackground(Color.blue);
                panelToAdd.add(label);
                panelToAdd.setAlignmentY(Component.TOP_ALIGNMENT);
                panel.add(panelToAdd, gbc, -1);
                panel.revalidate();

                JPanel panelToAdd2 = new JPanel();
                JLabel label2 = new JLabel("Test 2");
                panelToAdd2.setBackground(Color.green);
                panelToAdd2.add(label2);
                panel.add(panelToAdd2, gbc, -1);
                panel.revalidate();

                JPanel panelToAdd3 = new JPanel();
                JLabel label3 = new JLabel("Test 3");
                panelToAdd3.setBackground(Color.yellow);
                panelToAdd3.add(label3);
                panel.add(panelToAdd3, gbc, -1);
                panel.revalidate();
                frame.setVisible(true);
            }
        });
    }

}

基于@MadProgrammer的解决方案:

添加以下代码在最后创建一个“填充”不可见组件:

    GridBagConstraints gbc_finish = new GridBagConstraints();
    gbc_finish.gridwidth = GridBagConstraints.REMAINDER;
    gbc_finish.anchor = GridBagConstraints.NORTH;
    gbc_finish.weighty = 1;
    JPanel panelToAdd4 = new JPanel();
    panelToAdd4.setOpaque(false);
    panel.add(panelToAdd4, gbc_finish, -1);
    panel.revalidate();

【问题讨论】:

  • 您可以在末尾添加一个“空”组件并将关联的gridy 属性将GridBagConstraints 设置为1,如果您有动态UI,这会有点混乱。您也可以考虑使用VerticalLayout from the SwingX project
  • 谢谢,包含隐形填充组件的解决方案效果很好。我期待一个 Java-Out-of-the-Box 解决方案,所以我没有朝那个方向思考。我在上面发布了工作的 SSCCE!
  • 我注意到一个缺点:由于列表对象扩展,直到显示滚动条,最后总是有一个薄的“空”区域。但这根本不会影响用户...

标签: java swing user-interface jscrollpane jpanelmenu


【解决方案1】:

您是否尝试将它们放置在边框布局的北面板中?

frame.getContentPane().add(scrollPane, BorderLayout.NORTH);

【讨论】:

  • 这只会将滚动窗格放在顶部方向,并且还会阻止滚动窗格填充整个空间。但我希望滚动窗格内的面板顶部对齐,而不是滚动窗格本身
【解决方案2】:

一种选择可能是在 panel 的末尾添加一个填充符 JPanel,并具有以下限制:

    GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.weighty = 1.0;
    panel.add(new JPanel(), gridBagConstraints);

【讨论】:

  • 感谢您的回答。 @MadProgrammer 之前曾在评论中发布过此解决方案。但代码“gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2;”没有意义,因为它使用 REMAINDER 和 index = -1(在 Component#add(....) 方法中)为每个添加的组件创建一个新行。
猜你喜欢
  • 2021-02-14
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 2020-01-22
  • 2020-01-14
  • 2023-03-13
相关资源
最近更新 更多