Java BoxLayout使用全宽

时间:2016-08-08 12:50:14

标签: java swing layout-manager boxlayout

我正在创建一个有多个聊天记录的消息传递程序。在聊天窗口的一侧有一个JPanel,其中包含用于切换聊天的所有按钮的列表数组。我无法将侧面板中的所有按钮设置为相同的宽度,无论它们包含什么。但无论我尝试什么似乎都不起作用,我正在寻求一些帮助。请问您能解释一下代码的作用以及如何使用代码,以便我下次学习它。对不起,如果评论不是最好的,那么正在进行的工作,因为我等待代码工作,然后再添加详细的评论,否则我会不断更改它们。 :(

这是没有任何聊天的情况:

http://i.stack.imgur.com/OQVDI.png

这是多次聊天,您可以看到宽度变化

http://i.stack.imgur.com/Fwkna.png

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

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

1 个答案:

答案 0 :(得分:3)

首先,变量名不应以大写字母开头。您的一些变量名称是正确的,其他变量名称不正确。保持一致并遵循Java惯例!!!

  

。我无法让侧面板上的所有按钮宽度相同,

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

相反,您可以使用:

  1. GridLayout使所有按钮的大小相同。 GridLayout也将垂直填充该区域,这不是您想要的,因此您需要嵌套面板。因此,使用BorderLayout创建父面板。使用GridLayout按钮将您的面板添加到此父面板的BorderLayout.PAGE_START。然后将BorderLayout面板添加到滚动窗格。

  2. 一个GridBagLayout。你需要使用&#34; fill&#34; contstraint让组件填充单元格的宽度。

  3. 阅读Layout Managers上的Swing教程,了解更多信息和示例。

    或者可能采用不同的方法是使用JList来显示用户。