我看过这个线程,它问的是我现在遇到的完全相同的问题,但是发现答案并不令人满意:

Android's LinearLayout for Swing

我像这样创建了一个WeightedPanel类:

public class WeightedPanel extends javax.swing.JPanel {
private static final long serialVersionUID = 6844740568601141924L;
private boolean mVertical;
private double mLastWeight = 1;
private GridBagConstraints mConstraints;
private int mLastGrid = 0;

public WeightedPanel(boolean vertical) {
    mVertical = vertical;
    mConstraints = new GridBagConstraints();

    setLayout(new GridBagLayout());
}

@Override
public Component add(Component comp) {
    return add(comp, mLastWeight);
}

public Component add(Component comp, double weight) {
    if (mVertical) {
        mConstraints.weighty = weight;
        mConstraints.weightx = 1;
        mConstraints.gridy = mLastGrid;
        mConstraints.gridx = 0;
    } else {
        mConstraints.weightx = weight;
        mConstraints.weighty = 1;
        mConstraints.gridx = mLastGrid;
        mConstraints.gridy = 0;
    }
    mConstraints.fill = GridBagConstraints.BOTH;

    add(comp, mConstraints);

    mLastWeight = weight;
    mLastGrid += weight;
    return comp;
}

public Component add(Component comp, int weight) {
    return add(comp, (double) weight);
}


}

这种作品,但是我有两个问题:

1)在我的应用程序中,我有一个登录屏幕:

@Override
protected void addComponents(WeightedPanel jPanel) {
    mUpdateListener = new UpdateListener() {
        @Override
        public void onUpdate() {
            LoginFrame.this.onUpdate();
        }
    };
    WeightedPanel panel = getUserPanel();
    jPanel.add(panel);

    panel = getPasswordPanel();
    jPanel.add(panel);

    mLoginButton = getLoginButton();
    jPanel.add(mLoginButton);
}

private WeightedPanel getPasswordPanel() {
    WeightedPanel result = new WeightedPanel(false);

    JLabel label = new JLabel("Password");
    result.add(label);

    mPasswordField = new PasswordField(mUpdateListener);
    result.add(mPasswordField);
    return result;
}

private WeightedPanel getUserPanel() {
    WeightedPanel result = new WeightedPanel(false);

    JLabel label = new JLabel("User");
    result.add(label);

    mUserTextField = new TextField(mUpdateListener);
    result.add(mUserTextField);
    return result;
}


在实践中看起来像这样:

Click to view

为什么标签和文本字段的大小不一样?我认为这与“密码”比“用户”更长的字符串有关,但这显然不是我想要的!

2)我的第二个问题是这个。我有另一个像这样的屏幕:

@Override
protected void addComponents(WeightedPanel jPanel) {

    WeightedPanel scrollPanePanel = getOrdersScrollPane();
    jPanel.add(scrollPanePanel);

    WeightedPanel buttonPanel = getButtonPanel();
    jPanel.add(buttonPanel);
}

private WeightedPanel getOrdersScrollPane() {
    WeightedPanel result = new WeightedPanel(true);

    JPanel filterPanel = getFilterPanel();
    result.add(filterPanel, 1);

    mTableModel = new OrdersTableModel();
    mTable = new JTable(mTableModel);
    mTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    mTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent arg0) {
            checkEnabled();
        }
    });
    JScrollPane scrollPane = new JScrollPane(mTable);

    result.add(scrollPane, 40);

    return result;
}


在实践中,它看起来确实不错:

Click to view

但是,看看getOrdersScrollPane()函数。调用函数result.add(filterPanel,1);和result.add(scrollPane,50);说过滤器面板和滚动窗格之间的比例应为1:50,但是从滚动窗格看,它绝对不是过滤器面板大小的50倍。显然,我很夸张地说,我真的不想要1:50的比例。令我惊讶的是,我是否执行result.add(scrollPane,10);都没有关系。或result.add(scrollPane,50);

最佳答案

这两个问题源于对GridBagLayout的错误理解。多一点阅读和实验应该会有所帮助)回答眼前的问题:

1)这里的问题是您需要一个GridBagLayout,但是要添加2个独立的面板。
结果:顶部网格袋中的列独立于底部网格袋中的列。
为了解决这个问题,您可以尝试以下两种方法:


将标签和文本字段都添加到单个GridBag面板中。这样列将对齐。
设置标签的最小和首选大小,以使其宽度匹配并将其weightx设置为0(文本字段的weightx设置为非零)。这样,您就可以使GridBag为标签和文本字段分配相同数量的空间。


第一种方法是首选的,但并非总是可行的。第二种方法是hacky,当您更改标签字符串,用户设置其他默认字体等时,该方法可能会中断。

2)在这里,您误会了权重。
它不会使您的组件达到指定的比例。这应该足够清楚,因为您可以在单个布局中混合0和非0重量分量。
它的作用是为组件分配首选(或最小)大小,然后按该比例分配剩余空间。这意味着,如果通过调整窗口大小使面板高100像素,则顶部面板将增加2个像素,间距将增加98像素。
您可能想要的是使顶部过滤器的权重为0(以便在大窗口中没有尴尬的间距),并使用setPreferred和setMinimum大小(或通过在嵌入式组件上进行设置)控制其实际高度。

编辑

作为线性布局状态的文档,要实现固定比例的组件尺寸(最初的问题),必须将其首选尺寸设置为0,然后设置权重(然后所有空间均为剩余空间,并根据权重进行分配)只要)。这也适用于GridBag变体。

关于java - Swing中的Android LinearLayout等效项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23628400/

10-13 05:03