有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java 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) 个答案

  1. # 1 楼答案

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

    .I am having trouble getting all the buttons in the side panel to be the same width,

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

    相反,你可以使用:

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

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

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

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