簡體   English   中英

隱藏JSplitPane的左/右組件(或其他布局)

[英]Hide left/right component of a JSplitPane (or different layout)

目前,我編寫了一個小的客戶端應用程序。 我有一個帶有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 scrollListUser:

在此處輸入圖片說明

有人可以給我小費嗎? 用戶列表仍然可見(我以為JSplitPane會重新粉刷..)。我來自Qt(C ++),在Qt中我可以使用Dock小部件-但是Swing沒有一個部件,並且使用了第三個庫。我不知道-也許有解決方案。

看起來splitPane無法很好地處理不可見的組件-一種解決方法是適當地添加/刪除scrollPane:

public void setUserListEnabled(boolean status)
{
    splitPane.setRightComponent(status ? scrollListUser : null);
    splitPane.revalidate();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM