JPanel из подкласса неправильно добавляет в драйвер JFrame - PullRequest
0 голосов
/ 24 апреля 2020

У меня возникли проблемы при попытке добавить JPanel, который я создал в подклассе, к JFrame, который я создал в своем классе драйверов. Я не уверен, почему, но на панели не отображается, как это должно быть, и единственный способ заставить его работать - это определить JFrame в подклассе и классе драйвера, но затем я получаю два разных JFrames, один с материалом, который мне нужен это и пустой. Любые идеи? я добавил код из обоих классов, а также изображения того, как он должен выглядеть и как он выглядит.

мой класс драйверов;

public class GUIDriver extends JFrame {

public static void main(String[] args) {

    GUIDesign newOrder = new GUIDesign();

    //frame
    JFrame myframe = new JFrame("ROFA: Royal Furniture Ordering System");
    myframe.setLayout(new BorderLayout());

    myframe.setVisible(true);
    myframe.setSize(900,600); 
    myframe.setResizable(false);
    myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



    myframe.add(newOrder);

}

и мой GUI класс;

public class GUIDesign extends JPanel implements ActionListener {




    GUIDesign(){      

    JButton chair = new JButton("Add Chair");
    JButton desk  = new JButton("Add Desk");
    JButton table = new JButton("Add Table");
    JButton clear = new JButton("Clear All");
    JButton save = new JButton("Save file");
    JButton load = new JButton("Load file");


    GridBagLayout layout = new GridBagLayout();
    JPanel panelLeft = new JPanel(layout);
    panelLeft.setLayout(layout);
    panelLeft.setBorder(BorderFactory.createEtchedBorder(Color.lightGray, Color.black));
    this.add(panelLeft, BorderLayout.WEST);


   GridBagConstraints c = new GridBagConstraints(0, 0, 0, 1, 1.0, 1.0,
        GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(
              0,0,0,0), 0, 0);

   c.fill = GridBagConstraints.BOTH;

    panelLeft.add(save, c);

    c.gridx = 0;
    c.gridy = 1;
    panelLeft.add(load, c);

    c.gridx = 0;
    c.gridy = 2;
    panelLeft.add(chair, c);

    c.gridx = 0;
    c.gridy = 3;
    panelLeft.add(table, c);


    c.gridx = 0;
    c.gridy = 4;
    panelLeft.add(desk, c);

    c.gridx = 0;
    c.gridy = 5;
    panelLeft.add(clear, c);

    }

@Override
    public void actionPerformed(ActionEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated 
    methods, choose Tools | Templates.
}

Вот как это должно выглядеть:

enter image description here

и вот что я в итоге получаю:

enter image description here

спасибо.

1 Ответ

0 голосов
/ 24 апреля 2020

По умолчанию JPanel использует FlowLayout. FlowLayout отобразит компоненты в их предпочтительном размере, и по умолчанию используется выравнивание по центру, которое можно изменить влево или вправо.

this.add(panelLeft, BorderLayout.WEST);

Вы не можете просто использовать ограничение BorderLayout для FlowLayout, когда добавление компонента.

Код должен быть:

this.setLayout( new BorderLayout() );
this.add(panelLeft, BorderLayout.LINE_START); // new recommendation instead of using "WEST". 

Теперь это должно выровнять панель по левой стороне панели.

Также обратите внимание, что при использовании GridLayout будет проще, чем использовать GridBagLayout.

Код для добавления кнопок на панель будет простым:

JPanel panelLeft = new JPanel( new GridLayout(0, 1) );
panelleft.add(save);
panelLeft.add(load);

Нет необходимости в каких-либо ограничениях.

...