1

状態を選択すると、フレームのコンテンツ ペインからそのコンポーネントが削除されます。次に、選択した状態に応じて、別のクラスがコンテンツ ペインを取得して追加します。その後、フレームはパックされ、それに応じてサイズが変更されます。

パネルを並べて配置したり、パネルを上下に配置したりできるなど、フレーム内の内容を自由に制御したいので、CardLayoutを使用したくありません。(ログイン画面とチャットの両方を 1 つのパネルで処理したいのですが、その隣に別のパネルを表示できるようにします)。

ログインとチャット画面に JFrame のコンテンツ ペインを使用していますが、コードを実行すると、内側が白い小さなフレーム (サイズは多少ありますが、ほとんどありません) が表示されます。

  1. フレームを表示
  2. チャットに切り替える
  3. ペインのすべてを削除します (現在は何もありません)
  4. コンポーネントをペインに追加する
  5. ペインに合わせてサイズを調整できるようにフレームをパックします
  6. 必要に応じて再検証します (いつ再検証する必要があるかわかりません)

私が間違っていることを教えてください。おそらく正しい方向に導いてください。PS: エラーはありません

編集:私が考えることができる唯一のことは、私はframe.getContentPane()メソッドを通過していて、メソッドは値渡しであるため、実際の参照はframe.getContentPane()私が求めている変更に気付いていない可能性があるということです. しかし、なぜフレームの内側が白くなるのか (私の JTextArea がレンダリングを試みたかのように) わからず、フレームの内側にパディングがあるので、何かが起こっているに違いありません..

Main.java:

package main;

import ui.Frame;

public class Main {
    public static Frame frame = new Frame();

    public static void main(String[] args) {
        frame.show();
        frame.switchState(State.chat);

    }

    public static enum State {
        login, chat;
    }
}

Frame.java:

package ui;

import main.Main.State; 
import javax.swing.JFrame;

public class Frame {
        private Panel currentpanel; //from package ui, not AWT
        private ChatPanel chatpanel = new ChatPanel();

        private JFrame frame;
        public Frame() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
        }

        public void show() {
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }

        public void switchState(State state) {
            frame.removeAll();

            switch(state) {
                 case chat:
                currentpanel = chatpanel;
                currentpanel.addComponentsTo(frame.getContentPane());
                break;
            }
            frame.pack();
            frame.revalidate();
        }
    }

Panel.java:

package ui;

import java.awt.Container;

public interface Panel {
    public void addComponentsTo(Container pane);
}

ChatPanel.java:

package ui;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JTextArea;

public class ChatPanel implements Panel {
    private JTextArea toparea = new JTextArea();
    private JTextArea bottomarea = new JTextArea();

    @Override
    public void addComponentsTo(Container pane) {
        pane.setPreferredSize(new Dimension(500, 500));
        pane.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridy = 0;
        gbc.gridx = 0;
        gbc.ipadx = 450;
        gbc.ipady = 350;
        pane.add(toparea, gbc);

        gbc.gridy = 1;
        gbc.ipady = 100;
        pane.add(bottomarea);
    }
}
4

3 に答える 3

0

私はそれがかなりイライラすることを知っています。

電話してみましたか

pack(); or repaint();
于 2014-03-25T23:02:11.977 に答える
0

問題が見つかりました。frame.removeAll();何かを追加する前に呼び出していました。

を試しif(frame.getComponents().length > 0)てみたところ、それでもトリガーremoveAll()されましたが、問題は修正されませんでした。まだ何も追加していないのを見て、(オブジェクトを出力して) コンポーネントが何であるかを確認したところ、JRootPane.

その後、印刷してみましたがframe.getContentPane().getComponents().length、予想通り 0 でした。

簡単に言えば、これはどのようswitchPanel(State state)に見えるべきかです:

    public void switchState(State state) {
        if(frame.getContentPane().getComponents().length > 0)
             frame.removeAll();

        switch(state) {
             case chat:
                 currentpanel = chatpanel;
                 currentpanel.addComponentsTo(frame.getContentPane());
                 break;
        }
        frame.pack();
        frame.revalidate();
    }
于 2014-03-25T23:30:17.093 に答える