gpt4 book ai didi

java - 隐藏 JSplitPane 的左/右组件(或不同的布局)

转载 作者:行者123 更新时间:2023-11-30 07:19:29 24 4
gpt4 key购买 nike

目前我正在编写一个小客户端应用程序。我有一个带有 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);
}
}
}

结果是:

enter image description here

还有隐藏的 JScrollPane scrollListUser:

enter image description here

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

最佳答案

看起来 splitPane 无法很好地处理不可见组件 - 一种解决方法是根据需要添加/删除 scrollPane:

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

关于java - 隐藏 JSplitPane 的左/右组件(或不同的布局),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14644362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com