2016-08-08 10 views
0

Я создаю программу обмена сообщениями с несколькими чатами. На стороне окна чата есть JPanel, содержащий массив списка всех кнопок для переключения чатов. У меня возникли проблемы с тем, чтобы все кнопки на боковой панели были одинаковой ширины, независимо от того, что они содержат. Но все, что я пытаюсь, похоже, не работает, и я ищу какую-то помощь. Пожалуйста, вы можете объяснить, что делает код и как его можно использовать, чтобы я мог узнать его в следующий раз. Извините, если комментарии не самые лучшие, это незавершенная работа, так как я жду, пока код работает, прежде чем добавлять подробные комментарии, в противном случае я постоянно меняю их. :(Java BoxLayout использовать полную ширину

Это то, что она выглядит без чатов:

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

Чтобы лучше помочь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

Я вижу, что вы получили эту [mcve] рекомендацию раньше, и это потому, что это очень хорошая рекомендация. Также, пожалуйста, подумайте о том, чтобы принять ответ Camickr ниже. –

ответ

3

Прежде всего, имена переменных должны НЕ начинать с верхнего регистра символа. Некоторые из ваших имен переменных правильны, другие - нет. Будьте последовательны и соблюдайте соглашения Java!

.Я возникли проблемы при получении все кнопки на боковой панели, чтобы иметь такую ​​же ширину,

Не используйте BoxLayout. Он не изменяется автоматически на противоположной оси макета.

Вместо этого вы можете использовать:

  1. GridLayout сделать все кнопки одинакового размера. GridLayout также заполнит область вертикально, которая не является тем, что вы хотите, поэтому вам нужно будет развернуть панели. Поэтому создайте родительскую панель, используя BorderLayout. Добавьте свою панель с помощью GridLayout с кнопками на BorderLayout.PAGE_START этой родительской панели. Затем добавьте панель BorderLayout в панель прокрутки.

  2. a GridBagLayout. Вам нужно будет использовать «fill» contstraint, чтобы компонент заполнил ширину ячейки.

Прочтите учебник Swing по телефону Layout Managers для получения дополнительной информации и примеров.

Или, может быть, другой подход заключается в использовании JList для отображения пользователей.

+0

Wow, я никогда не думал использовать 'BorderLayout.PAGE_START' для этой проблемы раньше, я попробую позже, я решил это, добавив каждую кнопку в новую JPanel с FlowLayout каждый – Frakcool

 Смежные вопросы

  • Нет связанных вопросов^_^