JPanel仅在添加到容器时显示一个组件

时间:2013-04-04 00:13:56

标签: java swing user-interface jpanel

大家好,我有一点问题。我创建了一个JPanel并向其添加了组件,然后将JPanel添加到容器中。现在当我从main调用这个类时,会弹出一个窗口,但它只显示JPanel的第一个组件。为什么它只显示第一项而不是全部?感谢。

注意:此代码不完整,我只想弄清楚为什么我的组件在转移到其他内容之前没有出现,请解决组件问题。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;


public class Player extends JFrame implements ActionListener
{
       private CardLayout playerCard;
       private JPanel cardPanel;
       public String player1;
       public String player2;

      // Constructor:
      public Player()
      {

        setTitle("Game");
        setSize(300,200);
        setLocation(10,200); 
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());

                //set up the panel
        cardPanel = new JPanel();
        playerCard = new CardLayout();
        cardPanel.setLayout(playerCard);

                //get player one name
        JLabel p1Name = new JLabel("Player 1 Name:");
        JTextField oneName = new JTextField();

                //get the name for player 2
        JLabel p2Name = new JLabel("Player 2 Name:");
        JTextField twoName = new JTextField();

                //the button to start the game
        JButton start = new JButton("Start");

        //add the components << Why is only the first component shown??
        cardPanel.add(start);
        cardPanel.add(p1Name);
        cardPanel.add(oneName);
        cardPanel.add(p2Name);
        cardPanel.add(twoName);

        contentPane.add("startCard",cardPanel);
        }

    @Override
    public void actionPerformed(ActionEvent arg0) 
    {
        // TODO Auto-generated method stub

    } 
}

1 个答案:

答案 0 :(得分:3)

您没有正确使用布局。使用组件向 CardLayout 添加组件时使用String常量,而不是使用 FlowLayout 组件。并且String常量在 add方法中的组件之后。请阅读布局管理器教程,因为这里的解释非常好。看起来你正在使用不应该使用的CardLayout,这就是为什么你只看到一个组件。换句话说,你的程序正在使用完全低音的布局。

换句话说,使用CardLayout的容器一次只能显示一个组件,这意味着,因为cardPanel使用CardLayout,它只能显示一个组件,这里twoName可能是唯一的东西显示在它上面。