Как выровнять Button в JPanel таким образом - PullRequest
2 голосов
/ 24 августа 2011

Я пытаюсь создать графический интерфейс, используя JPanel и JButton. Пока это хорошо, за исключением того, что когда я создаю экземпляры JButton, кажется, что они совпадают в пределах одной линии. Я хочу, чтобы каждая кнопка была в одной строке, а не все в одной строке.

Как мне добиться желаемого эффекта?

public class Interface  extends JFrame{

    public  Interface ()
    {
    //frame 
        super("Panel");
        pack();
        setSize(500,400);
        setVisible(true);

    //declaration container
    Container c;
    c=getContentPane();
    c.setLayout(new BorderLayout());
    //declaration des panel avec leurs caracteristiques

    JPanel menu =new JPanel();
    JPanel MessageList =new JPanel();
    JPanel about=new JPanel();

    menu.setLayout(new FlowLayout());
    MessageList.setLayout(new FlowLayout());
    about.setLayout(new FlowLayout());

    menu.setBackground(Color.blue);
    MessageList.setBackground(Color.cyan);
    about.setBackground(Color.cyan);

    c.add(menu,BorderLayout.WEST);
    c.add(MessageList,BorderLayout.EAST);
    c.add(about,BorderLayout.SOUTH);
    //--------Button---------------------
    JButton button1=new JButton("button1");
    JButton button2=new JButton("Button2");

    menu.add(button1);
    menu.add(button2);
    //-----------------------------
        }

    public static void main(String args[])
    {
        Interface Message=new Interface();
        Message.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

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

Message GUI

import java.awt.*;
import javax.swing.*;

public class Interface  extends JFrame{

    public  Interface ()
    {
        //frame
        super("Panel");

        //declaration container
        Container c;
        c=getContentPane();
        c.setLayout(new BorderLayout());
        c.setBackground(Color.white);
        //declaration des panel avec leurs caracteristiques

        JPanel menu =new JPanel(new GridLayout(0,1,3,3));
        JPanel messageList =new JPanel(new FlowLayout());
        JPanel about=new JPanel(new FlowLayout());

        menu.setBackground(Color.blue);
        messageList.setBackground(Color.cyan);
        messageList.add(new JLabel("'messageList' padder"));
        about.setBackground(Color.green);
        about.add(new JLabel("'about' padder"));

        JPanel menuConstrain = new JPanel(new BorderLayout());
        menuConstrain.setBackground(Color.yellow);

        menuConstrain.add(menu,BorderLayout.NORTH);
        c.add(menuConstrain,BorderLayout.WEST);
        c.add(messageList,BorderLayout.EAST);
        c.add(about,BorderLayout.SOUTH);
        //--------Button---------------------
        JButton button1=new JButton("button1");
        JButton button2=new JButton("Button2");

        menu.add(button1);
        menu.add(button2);
        //-----------------------------

        pack();
        setSize(300,150);
        setVisible(true);
    }


    public static void main(String args[])
    {
        Interface Message=new Interface();
        Message.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Более подробный пример использования вложенных макетов см. NestedLayoutExample.java.


Кстати - это какой-то запутанный код!

  1. Иногда он использует общую номенклатуру «верблюжьих коров», но не другие.
  2. Существует конкретный класс с именем Interface.
  3. Существует панель с именем menu.
  4. На экране появляется рамка с названием Panel.
  5. Попробуйте добавить комментарии на эфиопском в следующий раз. Я читаю это примерно так же, как и на французском.
  6. Все это в сочетании с несовместимым отступом приводит к коду, который трудно читать и понимать.

Это форма запутывания бедного человека?


Обратите внимание, что графический интерфейс Swing должен быть создан в EDT.

2 голосов
/ 24 августа 2011

Если вы хотите сложить компоненты, используйте BoxLayout.Кроме того, обязательно следуйте рекомендациям @camickr.

См. Также:

...