Android中的LinearLayout等效于Swing

时间:2014-05-13 10:11:38

标签: java swing android-linearlayout

我已经看过这个帖子,它问了我现在的完全相同的问题,但发现答案有点令人不满意:

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

为什么这里的标签和文字字段都没有?我认为它与"密码"的事实有关。比#34; User"更长的字符串,但这显然不是我想要的!

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);

1 个答案:

答案 0 :(得分:0)

这两个问题源于对GridBagLayout的错误理解。更多的阅读和实验应该有所帮助)回答手头的问题:

1)这里的问题是你需要一个GridBagLayout,而是添加2个独立的面板。
结果:顶部网格袋中的列独立于底部网格袋中的列 要纠正这个问题,你可以尝试两件事:

  1. 将两个标签和两个文本字段添加到单个GridBag面板。这样,列就会对齐。
  2. 为标签制作最小尺寸和首选尺寸,使其宽度匹配并将其权重x设置为0(文本字段的权重x为非零)。这样你就可以让GridBags为标签和文本字段分配相同的空间量。
  3. 第一种方法是首选,但并非总是可行。第二种方法是hacky,只要你更改标签字符串,用户设置不同的默认字体等等,就可能会破坏等。

    2)在这里你误解了什么重要 使您的组件达到指定的比例。这应该是足够清楚的,因为你可以在一个布局中混合0和非0重量组件 它的作用是,它为组件分配首选(或最小)大小,并以该比例分配剩余空间。这意味着如果通过调整窗口大小使面板高出100个像素,2将转到顶部面板添加间距,98将转到表格。
    您可能想要的是使顶部过滤器0的重量(以便在大窗口中没有笨拙的间距)并使用setPreferred和setMinimum大小(或通过设置嵌入式组件上的那些)来控制其实际高度。

    修改

    作为线性布局状态的文档,要实现固定比例的组件大小(初始问题),必须将其首选大小设置为0,然后设置权重(然后所有空间都是剩余空间,并且是分布式的仅根据重量)。这也适用于GridBag变体。