java - 我的 JPanel 中的 GridBagLayout 不起作用

标签 java swing layout-manager gridbaglayout

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

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);
    }
}

最佳答案

您对 gridHeight 和 gridWidth 常量的使用似乎已关闭,并且似乎期望 GridBagLayout 不具备的功能。例如,您不能以这种方式定义 JTextArea 的列大小和行大小。相反,通过调用适当的构造函数或方法来设置文本组件的行大小和列大小以及 JList 的原型(prototype)大小。例如:

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();
         }
      });
   }
}

现在,如果您希望组件填充 View ,那么您需要将 GridBagConstraints 的weightx 和weighty 设置为非零值。

关于java - 我的 JPanel 中的 GridBagLayout 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143422/

相关文章:

java - data-th-text 和 th :text in Spring thymeleaf 有什么区别

java使用stringbuilder读取属性和xml文件

java - JOptionPane.JOptionDialog 获取用于 if 语句的输入值

java - setFont 和 setPreferredSize 之间的最终结果差异

java - 约束必须是字符串(或 null)

java - GridBagLayout 不稳定的调整大小和显示

java - 将数组列表转换为单个字符串

java - 与客户端证书的 SSL 重新协商导致服务器缓冲区溢出

java - 自定义 TableCellRenderer 不工作(表行呈现)

java - 在 Swing 中实现后退按钮功能