2015-05-09 80 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