2

嘿(:这是我第一次在这个论坛上寻求帮助,所以我希望我做的一切都是正确的

好的,我的问题是我用红色标记的。我的 JPanel 使用 BoxLayout.Y_AXIS 方向的 Boxlayout。我想这不是正确的选择。我不希望我的 JPanel(在线用户)、我的 JSeperator 和我的其他 JPanel(管理员)彼此分开。我希望它们直接堆叠在彼此下方。

图形用户界面图片: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;
}

我希望有人可以教我如何正确使用这种胶水或告诉我这样做的好方法(:

4

2 回答 2

2

编辑:更改为答案:

面板正好在彼此的顶部。问题是容纳两个 JPanel 的容器使用了什么样的布局?您是否也在做显示许多用户?那里需要 JList 或 JTable 吗?您能否展示一张您希望 gui 看起来像什么的图片,并在有典型数量的用户时展示它。还可以考虑创建和发布SSCCE。这需要您做一些工作,但非常值得。

编辑 1:
在进一步查看您的图像时,我建议您在此处使用 JTable,将“在线用户”和“静音”作为列标题,并将您当前在下面显示的内容、管理员和复选框作为一行表。将它放在 JScrollPane 中并在您当前显示它的位置显示它。

于 2011-09-18T13:29:54.093 回答
2

将两个面板添加到 boxlayout 后

add(Box.createVerticalGlue());

这会将这两个面板缩小到它们的首选尺寸,并在它们下方放置空间。

于 2011-09-18T13:30:24.683 回答