2

目前我写了一个小客户端应用程序。我有一个带有 JTextArea(服务器输出的显示区域)和一个用户列表的窗口。

我的计划是在菜单项上显示/隐藏此用户列表,但我不知道如何。我的想法:

  • 使用 BorderLayout:列表没有 JScrollPane。它有效,但我无法更改用户列表的宽度(因为 BorderLayout.WEST 和 BorderLayout.EAST 忽略宽度)

  • 对用户列表使用带有 JScrollPane 的 BorderLayout 并显示/隐藏 JScrollPane -> 不起作用,不要问我为什么......无论如何,这种方式不是一个好的解决方案

  • 使用 JSplitPane,将调整大小的权重设置为 0.9。当用户列表应该消失时,我最小化正确的组件(也就是用户列表)-> 如何?

我目前的代码:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;


public class SplitPaneTest extends JFrame implements ActionListener
{
    private JSplitPane splitPane;
    private JTextArea textDisplay;
    private JList<String> listUser;
    private JScrollPane scrollTextDisplay;
    private JScrollPane scrollListUser;
    private JCheckBox itemShowUser;

    public static void main(String[] args)
    {
        new SplitPaneTest();
    }

    public SplitPaneTest()
    {
        setTitle("Chat Client");
        setMinimumSize(new Dimension(800, 500));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textDisplay = new JTextArea();
        listUser = new JList<>();

        DefaultListModel<String> modelUser = new DefaultListModel<>();
        listUser.setModel(modelUser);

        modelUser.addElement(new String("User 1"));
        modelUser.addElement(new String("User 2"));
        modelUser.addElement(new String("User 3"));

        scrollTextDisplay = new JScrollPane(textDisplay);
        scrollListUser = new JScrollPane(listUser);

        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPane.setLeftComponent(scrollTextDisplay);
        splitPane.setRightComponent(scrollListUser);
        splitPane.setResizeWeight(0.9);
        setContentPane(splitPane);

        JMenuBar menubar = new JMenuBar();
        JMenu menuWindow = new JMenu("Window");

        itemShowUser = new JCheckBox("Show user list");
        itemShowUser.addActionListener(this);
        itemShowUser.setSelected(true);

        menuWindow.add(itemShowUser);
        menubar.add(menuWindow);
        setJMenuBar(menubar);

        setVisible(true);
    }

    public boolean isUserListEnabled()
    {
        return itemShowUser.isSelected();
    }

    public void setUserListEnabled(boolean status)
    {
        scrollListUser.setVisible(status);
    }

    @Override
    public void actionPerformed(ActionEvent ae)
    {
        if(ae.getSource() == itemShowUser)
        {
            boolean status = isUserListEnabled();
            setUserListEnabled(status);
        }
    }
}

结果是:

在此处输入图像描述

并使用隐藏的 JScrollPane 滚动列表用户:

在此处输入图像描述

有人可以给我小费吗?用户列表仍然可见(我认为 JSplitPane 会重新绘制..)。我来自 Qt(C++),在 Qt 中我可以使用停靠小部件 - 但 Swing 没有一个并使用第三个库....我不知道 - 也许有一个解决方案。

4

1 回答 1

4

看起来 splitPane 不能很好地处理不可见的组件 - 一种出路是根据需要添加/删除 scrollPane:

public void setUserListEnabled(boolean status)
{
    splitPane.setRightComponent(status ? scrollListUser : null);
    splitPane.revalidate();
}
于 2013-02-01T11:00:29.013 回答