我已经看过这个帖子,它问了我现在的完全相同的问题,但发现答案有点令人不满意:
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;
}
实际上看起来像这样:
为什么这里的标签和文字字段都没有?我认为它与"密码"的事实有关。比#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;
}
在实践中它看起来并不好看:
但是看看getOrdersScrollPane()函数。函数调用result.add(filterPanel,1);和result.add(scrollPane,50);假设过滤器面板和滚动窗格之间的比例应为1:50,但是看滚动窗格,它绝对不是过滤器面板大小的50倍。显然,我夸大自己的观点,我不是真的想要1:50的比例;它只是让我觉得我是否做result.add没有任何区别(scrollPane,10);或result.add(scrollPane,50);
答案 0 :(得分:0)
这两个问题源于对GridBagLayout的错误理解。更多的阅读和实验应该有所帮助)回答手头的问题:
1)这里的问题是你需要一个GridBagLayout,而是添加2个独立的面板。
结果:顶部网格袋中的列独立于底部网格袋中的列
要纠正这个问题,你可以尝试两件事:
第一种方法是首选,但并非总是可行。第二种方法是hacky,只要你更改标签字符串,用户设置不同的默认字体等等,就可能会破坏等。
2)在这里你误解了什么重要
不使您的组件达到指定的比例。这应该是足够清楚的,因为你可以在一个布局中混合0和非0重量组件
它的作用是,它为组件分配首选(或最小)大小,并以该比例分配剩余空间。这意味着如果通过调整窗口大小使面板高出100个像素,2将转到顶部面板添加间距,98将转到表格。
您可能想要的是使顶部过滤器0的重量(以便在大窗口中没有笨拙的间距)并使用setPreferred和setMinimum大小(或通过设置嵌入式组件上的那些)来控制其实际高度。
修改强>
作为线性布局状态的文档,要实现固定比例的组件大小(初始问题),必须将其首选大小设置为0,然后设置权重(然后所有空间都是剩余空间,并且是分布式的仅根据重量)。这也适用于GridBag变体。