好的,我的问题是我用红色标记的。我的JPanel使用Boxlay,BoxLayout.Y_AXIS方向。我想这不是正确的选择。我不希望我的JPanel(在线用户),我的JSeperator和我的其他JPanel(管理员)彼此分开。我希望他们直接堆叠在彼此之下。
GUI的图片:http://dl.dropbox.com/u/10049103/notcool.png我听说我应该可以使用某种“粘合剂”,但却无法按预期工作。我还听说我必须使用GridBagLayout,但这看起来非常复杂,如果有更简单的方法,我真的很想。
以下是标记的JPanel的代码(如果需要,不知道):
package Client;
import Server.User;
import java.awt.BorderLayout;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
/**
*
* @author Sune
*/
public class OnlineUsersPanel extends JPanel {
private UserWindow owner; public void setOwner(UserWindow uw) { owner = uw; }
private HashMap<String, ShowUserPanel> userPanels = new HashMap<String, ShowUserPanel>();
public OnlineUsersPanel() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.add(addStart());
this.add(new JSeparator());
System.out.println("OnlineUsersPanel con called");
}
void addUser(User user) {
ShowUserPanel newPanel = new ShowUserPanel(owner, user.getUserName());
userPanels.put(user.getUserName(), newPanel);
this.add(newPanel);
owner.updateGUI();
}
void deleteUser(User user) {
ShowUserPanel toRemove;
for (Iterator i = userPanels.keySet().iterator(); i.hasNext();) {
String tempUserName = (String) i.next();
if (tempUserName.equals(user.getUserName())) {
toRemove = userPanels.remove(tempUserName);
this.remove(toRemove);
System.out.println("Fundet og fjernet");
break;
}
}
}
private JPanel addStart() {
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(new JLabel("Online Users:"), BorderLayout.LINE_START);
p.add(new JLabel("mute:"), BorderLayout.LINE_END);
return p;
}
我希望有人可以让我了解如何正确使用胶水或告诉我这样做的好方法(:
答案 0 :(得分:2)
编辑:更改为答案:
面板正好在彼此之上。问题是持有两个JPanels的容器正在使用什么样的布局?您还在显示许多用户吗?你需要一个JList或JTable吗?你能展示你想要gui的样子,并在有一定数量的用户时展示它。另请考虑创建和发布SSCCE。这需要你做一些工作,但是非常值得。
编辑1:
在进一步审查您的图像时,我建议您使用JTable,其中“在线用户”和“静音”作为列标题,以及您当前显示的内容,管理员和复选框作为JTable的一行。将它放在JScrollPane中,并将其显示在当前显示它的位置。
答案 1 :(得分:2)
将两个面板添加到boxlayout后
add(Box.createVerticalGlue());
这会将这两个面板缩小到他们喜欢的尺寸,并将空间放在它们下面。