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);
        }
    }
}

そして結果は次のとおりです。

ここに画像の説明を入力してください

そして隠されたJScrollPanescrollListUserで:

ここに画像の説明を入力してください

誰かが私にヒントを与えることができますか?ユーザーリストはまだ表示されています(JSplitPaneが再描画されると思いました。)。私はQt(C ++)から来ており、Qtではドックウィジェットを使用できますが、Swingにはドックウィジェットがなく、3番目のライブラリを使用します。わかりません-解決策があるかもしれません。

4

1 に答える 1

4

splitPaneは非表示のコンポーネントをうまく処理できないようです-解決策は、必要に応じてscrollPaneを追加/削除することです。

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