我正在编写一个允许多个用户分享屏幕截图的程序。每次用户连接时,参与“房间”的每个人(一群能够彼此接收屏幕截图的用户)都能够看到用户拍摄的屏幕截图。为了能够看到屏幕截图,框架需要自我分割,以便为该用户的屏幕截图提供专用空间。
我决定使用GridLayout,因为它将组件拆分成大小相等的矩形,这正是我要找的。布局完全符合我的需要,除了有一个问题。如果我的GridLayout配置了两行和一行,则最底部的行仍将被拆分为两列,即使只有一个组件也是如此。这是预期的行为,但有一个走动,最好不使用不同的布局?我非常喜欢GridLayout的简单性。我考虑过使用BorderLayout,但它是有限的,因为我可以放置一定数量的空格。
不支持图片的格式,所以我无法将它们嵌入到这个问题中。 这是框架看起来像是满的。我用实际屏幕截图代替按钮,因为我只是在测试。
http://cl.ly/0N311g3w061P1B0W1T3s/Screen%20shot%202012-05-13%20at%204.23.25%20PM.png
现在,这是我从最底部的行中删除按钮时的外观: http://cl.ly/2j3Z0V1r3w1S3F160j05/Screen%20shot%202012-05-13%20at%204.23.41%20PM.png
以下是我希望最底部行看起来的方式: http://cl.ly/0J2R2y2L06151F0k0Y0i/Screen%20shot%202012-05-13%20at%204.24.11%20PM.png
如何让最底部的行看起来像那样?请记住,我仍然希望其他行有两列,但我只希望最底层的列有一列。
谢谢!
答案 0 :(得分:2)
据我所知,你做不到。 GridLayout以这种方式完成。
但GridBagLayout将为您的计划做得很好。
看看这个在行和列中布置按钮的小型演示。 (单击按钮将其删除)。
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Test4 {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
final JPanel root = new JPanel(new GridBagLayout());
frame.add(root);
frame.setSize(600, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Timer t = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JButton b = new JButton("Hello" + root.getComponentCount());
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
root.remove(b);
updateConstraints(root);
}
});
root.add(b);
updateConstraints(root);
}
});
t.start();
}
});
}
protected static void updateConstraints(JPanel root) {
if (!(root.getLayout() instanceof GridBagLayout)) {
System.err.println("No a gridbaglayout");
return;
}
GridBagLayout layout = (GridBagLayout) root.getLayout();
int count = root.getComponentCount();
int col = (int) Math.round(Math.sqrt(count));
int row = (int) Math.ceil((double) count / col);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
int index = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
gbc.gridx = j;
gbc.gridy = i;
boolean last = index + 1 == count;
if (last) {
gbc.gridwidth = col - j;
}
Component c = root.getComponent(index);
layout.setConstraints(c, gbc);
if (last) {
break;
}
index++;
}
}
root.doLayout();
}
}
答案 1 :(得分:1)
我决定采用略有不同的方法。由于在有均匀数量的屏幕时使用GridLayout可以很好地布局单独的屏幕,所以如果有奇数数量的屏幕,我决定简单地将屏幕分成页面。
答案 2 :(得分:0)
我想您想使用GridBagLayout
- 请查看visual guide to layouts
特别是,使用GridBagLayout
,您可以使用GridBagConstraints
添加组件。这允许您指定每个组件的放置位置,以及每个组件应具有的重量 - 例如请参阅GridBagLayout tutorial。