java - 内容从 JPanel 的 vCenter 开始

标签 java swing gridbaglayout

我一直在为 Oxygen 插件开发 View ,但无法让 GridBagLayout 从顶部开始。目前,当您向 JPanel 添加内容时,它会在 div 中垂直居中,如下图所示。

Screenshot of problem

// swing imports
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JButton;
import javax.swing.JScrollPane;
// awt imports
import java.awt.Color;
import java.awt.Insets;
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class DBPediaPanel extends JPanel {

    private JScrollPane scrollPane;
    private JPanel scrollContent;
    private JButton btnAcceptAll;
    private int currentRow = 0;

    public DBPediaPanel() {
        this.setLayout(new BorderLayout());
        this.setBackground(Color.BLACK);

        this.add(getScrollPane(), BorderLayout.CENTER);

        btnAcceptAll = new JButton("Add Row");
        btnAcceptAll.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addStringToList("row " + currentRow);
                System.out.println("test");
            }
        });
        this.add(btnAcceptAll, BorderLayout.SOUTH);
    }

    private JScrollPane getScrollPane() {
        scrollContent = new JPanel(new GridBagLayout());;

        scrollPane = new JScrollPane(scrollContent);
        return scrollPane;
    }

    private GridBagConstraints createGbc(int x, int y) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;

        gbc.anchor = (x == 0) ? GridBagConstraints.FIRST_LINE_START : GridBagConstraints.FIRST_LINE_START;
        gbc.fill = (x == 0) ? GridBagConstraints.BOTH : GridBagConstraints.HORIZONTAL;

        gbc.insets = (y == 0) ? new Insets(3, 5, 3, 5) : new Insets(0, 5, 3, 5);
        gbc.weightx = (x == 0) ? 0.1 : 1.0;
        gbc.weighty = 0.0;

        return gbc;
    }

    public void addStringToList(String str) {
        System.out.println("in addStringToList");
        System.out.println("attempting to add " + str + " to the list");

        GridBagConstraints gbc = createGbc(0, currentRow);
        scrollContent.add(new JCheckBox(), gbc);

        gbc = createGbc(1, currentRow);
        scrollContent.add(new JTextField(str), gbc);

        // revalidate and repaint the scrollContent to ensure it gets added to the view

        scrollContent.layout();
        scrollContent.revalidate();
        scrollContent.repaint();

        currentRow++;
    }

}

感谢您的帮助。我几乎已经在那里了,但它似乎不尊重 gbc.anchor = GridBagConstraints.FIRST_LINE_START

最佳答案

GridBagLayout 默认情况下组件不会放置在容器中心周围

最常见的解决方案是将填充组件(例如 JLabel)放置在最后一个位置,并将其 weightx/y 设置为 1。在您的情况下,我会把它放在最后一行

关于java - 内容从 JPanel 的 vCenter 开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710646/

相关文章:

java - 确保路径字符串是有效的 java 路径字符串

java - JMH:不考虑内部方法时间

java - 从 JList 中删除一行

Java 2D 图形 : Animate Fractal tree

Java Swing : Improving cursor response using Threads

java - 使用 WindowBuilder 通过 Graphics2D 绘制图形

java - 为什么网格不遵守约束?

java - 向 JPanel 添加边框会影响添加到面板的组件的布局

Java GridBagLayout : Rows are overlapping

java - 使用 Spring HibernateTemplate。如何按ID删除?