2016-08-08 10 views
0

私は複数のチャットを持つメッセージングプログラムを作成しています。チャットウィンドウの横には、チャットを切り替えるためのすべてのボタンのリスト配列が含まれているJPanelがあります。サイドパネルのすべてのボタンが同じ幅になるのに問題があります。しかし、私が何をしようとしても動作していないと私はいくつかの助けを探しています。コードが何をどのように使用するのかを説明して、次回のためにそれを学ぶことができますか?申し訳ありませんが、コメントが最善でない場合は、コードが動作するまで待ってから詳細なコメントを追加します。それ以外は常に変更しています。 :(Java BoxLayout full widthを使用

これは、任意のチャットなしで次のようになります。

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]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

+0

これまでにこの[mcve]勧告を受けていることがわかりました。それは非常に良い勧告であるからです。また、下記のCamickrの回答を受け入れることを検討してください。 –

答えて

3

まず、変数名は大文字で始めるべきではありません。あなたの変数名の中には正しいものもあれば、そうでないものもあります。一貫性を保ち、Javaの規約に従ってください!

.Iは、BoxLayoutを使用しないでください、

をトラブルサイドパネル内のすべてのボタンが同じ幅であることを取得したのです。レイアウトの反対側の軸で自動的にサイズが変更されることはありません。

代わりに、使用することができます。

  1. GridLayoutをすべてのボタンと同じサイズにします。 GridLayoutは、あなたが望むものでない領域を垂直に塗りつぶします。そのため、パネルをネストする必要があります。したがって、BorderLayoutを使用して親パネルを作成します。この親パネルのBorderLayout.PAGE_STARTにあるボタンを使用してGridLayoutを使用してパネルを追加します。次に、BorderLayoutパネルをスクロールペインに追加します。

  2. a GridBagLayout。コンポーネントがセルの幅を埋めるようにするには、「塗りつぶし」コンストレイントを使用する必要があります。

詳細および例については、Layout ManagersのSwingチュートリアルを参照してください。

また、別の方法として、JListを使用してユーザーを表示することもできます。

+0

うわー、私はこれまでにこの問題に 'BorderLayout.PAGE_START'を使用することは考えていませんでした。後で試してみます。それぞれのボタンを新しいJPanelにFlowLayoutを付け加えて解決しました – Frakcool