2

私はJavaに不慣れで、ほとんどがCardLayoutです。JPanelsで表される「ウィンドウ」を単純に切り替えたい。CardLayoutのその仕事をどこかで読んだ。しかし、私の問題は、いつ(これはCardLayoutのものです)、中央の位置から離れて、数ピクセルのコンテンツを上にシフトすることadd chatPanelです。コードをスキップして、本来あるべき場所に移動しますか?mainPanelconnectPanelcreateChatPanel(),

私はこのコードを持っています:

package App;

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

import javax.swing.*;
import Validators.*;



public class GUI {

private JFrame mainFrame = null;
private JPanel mainPanel = null;
private CardLayout cl = new CardLayout();

public GUI(){


    try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
         } 
         catch (UnsupportedLookAndFeelException e) {
         }
         catch (ClassNotFoundException e) {
         }
         catch (InstantiationException e) {
         }
         catch (IllegalAccessException e) {
         }

    mainFrame = new JFrame("MainChat");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setSize(640,480);
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setResizable(false);
    mainFrame.setLayout(new GridBagLayout());

    JMenuBar menuBar = new JMenuBar();

    JMenu menuFile = new JMenu("Soubor");
    JMenu menuHelp = new JMenu("Nápověda");

    menuBar.add(menuFile);
    menuBar.add(menuHelp);

    menuFile.add(new JMenuItem("Nové Připojení"));
    menuFile.add(new JSeparator());
    menuFile.add(new JMenuItem("Konec"));
    menuHelp.add(new JMenuItem("O programu"));
    mainFrame.setJMenuBar(menuBar);


    createMainPanel();
    createConnectPanel();
    createChatPanel();

    mainFrame.setVisible(true);
}

public void createMainPanel() {

    mainPanel = new JPanel(cl);
    mainFrame.add(mainPanel);

}

public void createConnectPanel() {

    JPanel connectPanel = new JPanel();
    mainPanel.add(connectPanel,"connectPanel");

    JTextField ip = new JTextField();
    ip.setDocument(new JTextFieldLimit(15));
    ip.setColumns(11);

    JLabel iplabel = new JLabel("IP:");
    connectPanel.add(iplabel);
    connectPanel.add(ip);

    JButton connect = new JButton("Connect");
    connect.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            cl.show(mainPanel,"chatPanel");

        }
    });
    connectPanel.add(connect);

}

public void createChatPanel(){

    JPanel chatPanel = new JPanel();
    mainPanel.add(chatPanel,"chatPanel");

    JTextArea chatbox = new JTextArea();
    chatbox.setPreferredSize(new Dimension(200,200));
    chatPanel.add(chatbox);

}
}

どうか、私が台無しにしたものは?ありがとう。

4

2 に答える 2

2

メイン JPanel に 2 つの JPanel を追加するため、これら 2 つのパネルは両方ともメイン パネル内に収まる必要があります。

内側のパネルの 1 つが他のパネルよりもはるかに大きい場合、メイン パネルは大きい方のパネルに合わせて調整されます。

たとえば、次の行にコメントします。

chatbox.setPreferredSize(new Dimension(200,200));

あなたのテキストフィールドが置かれたままになるでしょう。これは、チャットボックスによってコンテナーのサイズが変更されないためです。

また、メイン パネルのサイズを設定していないため、メイン パネルは最初はメイン フレームと同じサイズではないことに注意してください。

connectPanel のサイズをメイン フレームと同じサイズに設定すると、chatPanel の追加時に connectPanel のサイズが自動的に変更されません (mainPanel のサイズが変更されるため)。

だからあなたができることは、真ん中の行を追加することです:

JPanel connectPanel = new JPanel();
connectPanel.setSize(640, 480);
mainPanel.add(connectPanel, "connectPanel");

、おそらくあなたの問題を解決します。

これでも問題ありませんが、すべての GUI 設計にMIG レイアウトを使用することを強くお勧めし ます。1 時間かけて学習すれば、かなりの時間を節約できます。また、サイズを手動で設定する必要がなくなります (したがって、設計変更ごとに GUI コードの半分を書き直す必要がなくなります)。

于 2011-04-17T18:29:02.097 に答える
2

JPanel を別の中央に配置する場合は、connectPanel をダム コンテナとして機能する別の JPanel に配置し、このコンテナに GridBagLayout を使用させます。次に、GridBagConstraints なしで connectPanel をコンテナーに追加すると、中央にある GridBagLayout のデフォルト位置に追加されます。次に、connectPanel に使用したのと同じ定数を使用して、このコンテナ JPanel を mainPanel に追加できます。

私は、レイアウトでコンポーネントのサイズを決定し、setSize や setPreferredSize の使用を避ける傾向があり、JFrame を表示する前に必ず pack() を呼び出します。JTextFieldのサイズや preferredSize を設定するのではなく、その列と行を設定して JScrollPane に配置し、その JScrollPane をビューに追加します。

編集:
これは、接続パネルのようなものを小さな GUI の上部、中央、下部に配置する例です。「次へ」ボタンを押して、私が何を意味するかを確認してください。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class GUI2 extends JPanel {
    public static final String CONNECT_NORTH = "connect north";
    public static final String CONNECT_CENTER = "connect center";
    private static final String CONNECT_SOUTH = "connect south";
    private static final String CHAT_PANEL = "chat panel";
    private CardLayout cardlayout = new CardLayout();

    public GUI2() {
        setLayout(cardlayout);
        add(createConnectPanel(BorderLayout.NORTH), CONNECT_NORTH);
        add(createConnectPanel(BorderLayout.CENTER), CONNECT_CENTER);
        add(createConnectPanel(BorderLayout.SOUTH), CONNECT_SOUTH);
        add(createChatPanel(), CHAT_PANEL);
    }

    public void nextPanel() {
        cardlayout.next(this);
    }


    private JPanel createConnectPanel(String borderlayoutLocation) {
        JPanel innerPanel = new JPanel();
        innerPanel.add(new JLabel("IP:"));
        innerPanel.add(Box.createHorizontalStrut(5));
        innerPanel.add(new JTextField(11));
        innerPanel.add(Box.createHorizontalStrut(5));
        innerPanel.add(new JButton(new AbstractAction("Next") {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                GUI2.this.nextPanel();
            }
        }));

        JPanel innerPanel2 = new JPanel(new GridBagLayout());
        innerPanel2.add(innerPanel);
        JPanel connectPanel = new JPanel(new BorderLayout());
        connectPanel.add(innerPanel2, borderlayoutLocation);
        return connectPanel;
    }

    private JPanel createChatPanel() {
        JPanel chatPanel = new JPanel(new BorderLayout(5, 5));
        chatPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        chatPanel.add(new JScrollPane(new JTextArea(15, 30)), BorderLayout.CENTER);
        chatPanel.add(new JTextField(), BorderLayout.SOUTH);

        return chatPanel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGui();
            }
        });
    }

    private static void createGui() {
        JFrame frame = new JFrame("App");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new GUI2());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
于 2011-04-17T18:52:35.587 に答える