2015-05-09 51 views
2

我对扩展JPanel的类有问题。在我的基于JFrame的游戏中,我有几个在程序运行时交换的JPanel(登录面板,新的acc表单面板等...全部在一个JFrame中)。我想用GBL切换到面板,但不幸的是它不能很好地显示内容......它只在屏幕中心显示ChatBox(JTextArea)和输入字段(JTextField),但我想把它们放在旁边其他。我的JPanel中的GridBagLayout不起作用

public class InGameMenu extends JPanel 

    private JTextArea chatBox; 
    private JPanel buttonPanel; 
    private TextField chatTextField; 
    private JList playersList; 
    private DefaultListModel listModel; 
    private ConnectionToServer conn; 
    private JFrame mainFrame; 

    public InGameMenu (ConnectionToServer conn, JFrame mainFrame) 
    { 
     this.setBackground(Color.CYAN); 
     this.conn = conn; 
     this.mainFrame = mainFrame; 
     mainFrame.setTitle("Game menu");   
     super.setLayout(new GridBagLayout());   
     chatBox = new JTextArea("This is player's chat.\n"); 

     GridBagConstraints gbc = new GridBagConstraints(); 

     // chat box 
     gbc.gridheight = 10; 
     gbc.gridwidth = 10; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.gridx = 0; 
     gbc.gridy = 0;   
     this.add(chatBox, gbc); 

     // chat text field   
     chatTextField = new TextField("dsadasda"); 
     chatTextField.setBackground(Color.GRAY); 
     gbc.gridheight = 1; 
     gbc.gridy = 1; 
     this.add (chatTextField, gbc); 

     // lista graczy 
     listModel = new DefaultListModel(); 
     playersList = new JList(listModel); 

     gbc.gridheight = 15; 
     gbc.gridwidth = 4; 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     this.add (playersList, gbc); 

     // panel przyciskow 
     buttonPanel = new JPanel(new FlowLayout());  
     gbc.gridheight = 1; 
     gbc.gridy = 1; 
     this.add (buttonPanel, gbc); 
    } 
} 
+0

您需要更好地定义您的期望和请求。正如所写,这是一个声明,不是一个问题,所以很难以这种方式获得帮助。 – ChiefTwoPencils

回答

2

您使用gridHeight和gridWidth常数似乎是关闭,似乎期待的是GridBagLayout中不具备的能力。例如,您不要像这样定义JTextArea的列大小和行大小。相反,请通过调用适当的构造函数或方法来设置文本组件的行大小和列大小以及JList的原型大小。例如:

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

public class InGameMenu extends JPanel { 

    private static final String[] EXAMPLE_TEXT = {"One", "Two", "Three"}; 
    private static final int COLUMNS = 40; 
    private static final int ROWS = 20; 
    private JTextArea chatBox; 
    private JPanel buttonPanel; 
    private TextField chatTextField; 
    private JList playersList; 
    private DefaultListModel listModel; 
    // private ConnectionToServer conn; 
    private JFrame mainFrame; 

    // public InGameMenu (ConnectionToServer conn, JFrame mainFrame) 
    public InGameMenu(JFrame mainFrame) { 

     this.setBackground(Color.CYAN); 
     // this.conn = conn; 
     this.mainFrame = mainFrame; 
     mainFrame.setTitle("Game menu"); 
     super.setLayout(new GridBagLayout()); 
     // chatBox = new JTextArea("This is player's chat.\n"); 
     chatBox = new JTextArea("This is player's chat.\n", ROWS, COLUMNS); 

     GridBagConstraints gbc = new GridBagConstraints(); 

     // chat box 
     // gbc.gridheight = 10; 
     // gbc.gridwidth = 10; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     // this.add(chatBox, gbc); 
     chatBox.setWrapStyleWord(true); 
     chatBox.setLineWrap(true); 
     JScrollPane scrollPane = new JScrollPane(chatBox); 
     this.add(scrollPane, gbc); 


     // chat text field 
     chatTextField = new TextField("dsadasda", COLUMNS); 
     chatTextField.setBackground(Color.GRAY); 
     // gbc.gridheight = 1; 
     gbc.gridy = 1; 
     this.add(chatTextField, gbc); 

     // lista graczy 
     listModel = new DefaultListModel(); 
     for (int i = 0; i < EXAMPLE_TEXT.length; i++) { 
     listModel.addElement(EXAMPLE_TEXT[i]); 
     } 
     playersList = new JList(listModel); 
     playersList.setPrototypeCellValue(String.format("%40s", " ")); 

     // gbc.gridheight = 15; 
     // gbc.gridwidth = 4; 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     this.add(playersList, gbc); 

     // panel przyciskow 
     buttonPanel = new JPanel(new FlowLayout()); 
     // gbc.gridheight = 1; 
     gbc.gridy = 1; 
     this.add(buttonPanel, gbc); 

    } 

    public InGameMenu() { 
     // TODO Auto-generated constructor stub 
    } 

    private static void createAndShowGui() { 

     JFrame frame = new JFrame("In Game Menu"); 
     InGameMenu mainPanel = new InGameMenu(frame); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

现在,如果你希望你的组件来填充视图,那么你要设置的weightx和沉重的GridBagConstraints为非零值。

+0

谢谢你。这是我正在寻找的。 – Robson021

相关问题