2016-08-08 6 views
0

여러 채팅이있는 메시징 프로그램을 만들고 있습니다. 채팅 창의 측면에는 채팅을 전환하는 모든 버튼의 List Array가 포함 된 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(); 
} 
,210

여기가 초기화 방법 : 모든

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

첫째, 변수 이름은 대문자 문자로 시작하지 않아야합니다. 일부 변수 이름은 정확하고 다른 변수 이름은 올바르지 않습니다. 일관되고 자바 규칙을 따르십시오 !!! .I 문제가 같은 폭으로 측면 패널의 모든 버튼을 얻는 데

,

는 BoxLayout에서는 사용하지 마십시오. 레이아웃의 반대 축에서 자동으로 크기가 조정되지 않습니다.

대신 다음을 사용할 수 있습니다

  1. GridLayout 모든 버튼을 같은 크기로 만들 수 있습니다. GridLayout은 원하는 영역이 아닌 영역을 수직으로 채우므로 패널을 중첩해야합니다. 따라서 BorderLayout을 사용하여 상위 패널을 만듭니다. 이 상위 패널의 BorderLayout.PAGE_START에있는 버튼을 사용하여 GridLayout을 사용하여 패널을 추가하십시오. 그런 다음 BorderLayout 패널을 스크롤 창에 추가하십시오.

  2. a GridBagLayout. 구성 요소가 셀 너비를 채우게하려면 "채우기"컨 스트레인 트를 사용해야합니다.

자세한 내용과 예제는 Layout Managers의 스윙 튜토리얼을 참조하십시오.

다른 접근 방식은 JList을 사용하여 사용자를 표시하는 것입니다.

+0

와우, 이전에이 문제에 대해'BorderLayout.PAGE_START'을 사용 해본 적이 한번도 없었습니다. 나중에 시도해 보겠습니다. 각 버튼을 FlowLayout이있는 새 JPanel에 추가하여이 문제를 해결했습니다. – Frakcool