Java BoxLayout使用全宽度

Java BoxLayout使用全宽度,java,swing,layout-manager,boxlayout,Java,Swing,Layout Manager,Boxlayout,我正在创建一个包含多个聊天的消息传递程序。在聊天窗口的一侧有一个JPanel,其中包含用于切换聊天的所有按钮的列表数组。我很难使侧面板中的所有按钮都具有相同的宽度,无论它们包含什么。但无论我尝试什么,似乎都不起作用,我正在寻求帮助。请你解释一下代码的作用和使用方法,以便我下次学习。很抱歉,如果评论不是最好的,这是一项正在进行的工作,因为我会等到代码运行后再添加详细的评论,否则我会不断更改它们:( 这就是没有聊天时的样子: 这是与多个聊天,你可以看到宽度的变化 以下是添加新用户时运行的代码:

我正在创建一个包含多个聊天的消息传递程序。在聊天窗口的一侧有一个JPanel,其中包含用于切换聊天的所有按钮的列表数组。我很难使侧面板中的所有按钮都具有相同的宽度,无论它们包含什么。但无论我尝试什么,似乎都不起作用,我正在寻求帮助。请你解释一下代码的作用和使用方法,以便我下次学习。很抱歉,如果评论不是最好的,这是一项正在进行的工作,因为我会等到代码运行后再添加详细的评论,否则我会不断更改它们:(

这就是没有聊天时的样子:

这是与多个聊天,你可以看到宽度的变化

以下是添加新用户时运行的代码:

public void newUser() {
    JPanel dialogue = new JPanel();
    dialogue.setLayout(new BoxLayout(dialogue, BoxLayout.Y_AXIS));

    //Creating/adding dialogue components
    JLabel Enter_ip = new JLabel("Enter the ip address");
    JTextField Get_ip = new JTextField("");
    dialogue.add(Enter_ip);
    dialogue.add(Get_ip);
    dialogue.add(Box.createHorizontalStrut(15));

    JLabel Enter_name = new JLabel("Enter the user's name");
    JTextField Get_name = new JTextField("");
    dialogue.add(Enter_name);
    dialogue.add(Get_name);

    //Creating the dialogue box
    JOptionPane.showConfirmDialog(null, dialogue, "New User", JOptionPane.OK_CANCEL_OPTION);

    //Getting data from dialogue box
    String ip = Get_ip.getText();
    String name = Get_name.getText();

    //Try connecting to other user here

    //Adding user message data
    int size = Users_Messages_Data.size();
    Users_Messages_Data.add(new ArrayList());//New user
    Users_Messages_Data.get(size).add(new ArrayList());//Messages
    Users_Messages_Data.get(size).add(new ArrayList());//Details
    Users_Messages_Data.get(size).get(1).add(name);
    Users_Messages_Data.get(size).get(1).add(ip);
    Users_Messages_Data.get(size).get(1).add("port number");

    //adds new UserButton
    int temp = users.size();
    users.add(new JButton(Users_Messages_Data.get(size).get(1).get(0)));
    users.get(temp).addActionListener(this);
    users.get(temp).setSize(new Dimension(500, 500));
    SelectUser.add(users.get(temp), gbc);
    Messaging.revalidate();
    pack();
}
以下是初始化方法:

public void MessagingGUI() {

    //Creates JFrame and pane         
    Messaging = new JFrame();
    Container pane = getContentPane();
    JLabel info = new JLabel("29/07/2016      15:36");

    //Creates user chats panel        
    SelectUser = new JPanel(new GridBagLayout());
    gbc = new GridBagConstraints();
    gbc.weightx = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridwidth = GridBagConstraints.REMAINDER;

    SelectUser.setLayout(new BoxLayout(SelectUser, BoxLayout.Y_AXIS));
    SelectUser.setSize(new Dimension(500, 500));

    //Adds different chats        
    users = new ArrayList<JButton>();
    int x;
    for (x = 0; x < Users_Messages_Data.size(); x++) {
        users.add(new JButton(Users_Messages_Data.get(x).get(1).get(0)));
        users.get(x).addActionListener(this);
        SelectUser.add(users.get(x), gbc);
    }
    JButton newUser = new JButton("+");
    newUser.addActionListener(this);
    SelectUser.add(newUser);
    JScrollPane UserScroll = new JScrollPane(SelectUser,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    //Creates messages feed        
    JPanel Messages = new JPanel();
    Messages.setLayout(new BoxLayout(Messages, BoxLayout.Y_AXIS));
    AllMessages = new JTextArea(10, 30);
    AllMessages.setBackground(Color.WHITE);
    AllMessages.setEditable(false);
    AllMessages.setBorder(BorderFactory.createLineBorder(Color.BLUE, 1));

    JScrollPane MessageScroll = new JScrollPane(AllMessages,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

   //Creates user text entry box        
    UserText = new JTextArea(5, 30);
    //UserText.setLineWrap(true);
    //UserText.setWrapStyleWord(true);
    UserText.setBorder(BorderFactory.createLineBorder(Color.CYAN, 1));
    UserText.setText("Enter Message. Press enter to send");
    UserText.setFocusable(true);
    UserText.addKeyListener(this);
    UserText.setPreferredSize(new Dimension(5, 20));

    //Adds all components to pane        
    Messages.add(info);
    Messages.add(MessageScroll);
    Messages.add(UserText);
    pane.add(UserScroll, BorderLayout.WEST);
    pane.add(Messages, BorderLayout.CENTER);

    //JFrame setup        
    Messaging.setTitle("Messaging");
    Messaging.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Messaging.setContentPane(pane);
    Messaging.setVisible(true);
    Messaging.setSize(400, 350);
    Load_User(current_user);
}
public-void-MessagingGUI(){
//创建JFrame和窗格
消息=新JFrame();
容器窗格=getContentPane();
JLabel info=新JLabel(“29/07/2016 15:36”);
//创建用户聊天面板
选择user=newJPanel(newGridBaglayout());
gbc=新的GridBagConstraints();
gbc.weightx=1;
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.gridwidth=GridBagConstraints.rements;
SelectUser.setLayout(新的BoxLayout(SelectUser,BoxLayout.Y_轴));
选择User.setSize(新尺寸(500500));
//添加不同的聊天
users=newarraylist();
int x;
对于(x=0;x
首先,变量名不应以大写字符开头。有些变量名是正确的,有些是不正确的。请保持一致并遵循Java约定

.我很难使侧面板上的所有按钮都具有相同的宽度

不要使用BoxLayout。它不会在布局的相反轴上自动调整大小

相反,您可以使用:

  • a
    GridLayout
    使所有按钮大小相同。
    GridLayout
    也会垂直填充区域,这不是您想要的,因此您需要嵌套面板。因此,使用
    BorderLayout
    创建父面板。使用
    GridLayout
    将面板与按钮一起添加到
    BorderLayout.PAGE_开始此父面板的
    。然后将BorderLayout面板添加到滚动窗格中

  • a
    GridBagLayout
    。您需要使用“fill”contstraint使组件填充单元格的宽度

  • 有关更多信息和示例,请阅读上的Swing教程


    或者另一种方法是使用
    JList
    来显示用户。

    首先,变量名不应以大写字符开头。有些变量名是正确的,有些是不正确的。请保持一致并遵循Java惯例

    .我很难使侧面板上的所有按钮都具有相同的宽度

    不要使用BoxLayout。它不会在布局的相反轴上自动调整大小

    相反,您可以使用:

  • a
    GridLayout
    使所有按钮大小相同。
    GridLayout
    也会垂直填充区域,这不是您想要的,因此您需要嵌套面板。因此,使用
    BorderLayout
    创建父面板。使用
    GridLayout
    将面板与按钮一起添加到
    BorderLayout.PAGE_开始此父面板的
    。然后将BorderLayout面板添加到滚动窗格中

  • a
    GridBagLayout
    。您需要使用“fill”contstraint使组件填充单元格的宽度

  • 有关更多信息和示例,请阅读上的Swing教程


    或者另一种方法是使用
    JList
    来显示用户。

    Wow,我从来没有想过使用
    BorderLayout.PAGE\u START
    对于这个问题,我以后会尝试一下,我已经解决了这个问题,通过将每个按钮添加到一个新的JPanel中,每个按钮都有一个FlowLayout,我从来没有想过使用
    BorderLayout.PAGE\针对此问题启动