Как мне добавить в BorderLayout.Center?

У меня проблемы с добавлением в центр BorderLayout. На паре экранов ничего не появляется. Этот код все еще находится в разработке, но он предназначен для службы проката автомобилей. В конечном итоге мы подключаем наш код к JDBC и собираемся получить от базы данных соответствующие результаты. В идеале код должен отображать несколько экранов для пользователя, когда он использует службу. На одном экране они будут вводить свою информацию, на другом - для фильтрации по различным параметрам автомобиля, а затем конечным результатом будет отображение результатов, возвращаемых подключенной базой данных. Я добавляю несколько панелей в центр BorderLayout, но изначально не делаю их видимыми. Они станут видимыми при нажатии кнопок.

//The following is the beginning of our code. It is not complete yet

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.sql.*;
import java.util.Scanner;

public class Rental extends JFrame implements ActionListener, Customer, Car
{
    Container cont = getContentPane();

    Font myFont = new Font("tester ", Font.BOLD, 34);

    BorderLayout border = new BorderLayout();
    FlowLayout flow = new FlowLayout();
    GridLayout grid1 = new GridLayout(0,1);

    JPanel testPanel = new JPanel(); //Panel where I tried to add to center

    /* myDrive logo */
        JButton custom;

    /*Opening Screen: */ 
    JPanel welcomePnl = new JPanel();
    JLabel titleLbl = new JLabel("");
    //This is a draft summary//
    JLabel info = new JLabel(" Welcome to myDrive!. myDrive is a car rental application designed for you to choose a car based on your preferences.");
    JPanel btnPnl = new JPanel();
    JPanel btnPnl2 = new JPanel(); //contains Car instead of begin

    JCheckBox yesBox = new JCheckBox("Agree to Terms & Conditions");
    JCheckBox noBox = new JCheckBox(" Do Not Agree");

    /* Rental Panel--Screen 2: Fields for user to enter for rental*/
    JPanel rentalPnl = new JPanel();
    JTextField nameField = new JTextField("First Name");
    JTextField lastName = new JTextField("Last Name");
    JButton carBtn = new JButton("Car"); //continues next

    /*Car Panel--Screen 3: Car panel for car options*/
    JPanel carPnl = new JPanel();
    JPanel brandPnl = new JPanel(); //brands
    JPanel colorPnl = new JPanel(); //colors
    JLabel carLbl = new JLabel("Welcome to the Car selection screen:");
    JCheckBox brand1 = new JCheckBox("BMW");
    JCheckBox brand2 = new JCheckBox("Mercedez");
    JCheckBox brand3 = new JCheckBox("Tesla");
    JCheckBox brand4 = new JCheckBox("Ford");
    JCheckBox brand5 = new JCheckBox("Chrystler");

    JCheckBox color1 = new JCheckBox("Black");
    JCheckBox color2 = new JCheckBox("Silver");
    JCheckBox color3 = new JCheckBox("Red");
    JCheckBox color4 = new JCheckBox("Blue");

    JCheckBox drive1 = new JCheckBox("AWD");
    JCheckBox drive2 = new JCheckBox("TWD");

    JButton beginBtn = new JButton("Begin");
    JButton exitBtn = new JButton("Exit");

    //Constructor
    public Rental()
    {
        super("MyDrive");
        cont.add(testPanel, BorderLayout.CENTER);
        testPanel.setBackground(Color.PINK);

        cont.setLayout(border); //border layout for the container

        //Opening Screen
        beginBtn.addActionListener(this);
        beginBtn.setToolTipText("Being your rental process");
        exitBtn.addActionListener(this);
        welcomePnl.setBackground(Color.GRAY);
        welcomePnl.add(titleLbl);
        welcomePnl.add(info);
        info.setVisible(true);
        cont.add(info, BorderLayout.CENTER);
        cont.add(welcomePnl, BorderLayout.NORTH);
        titleLbl.setFont(myFont);

        cont.add(btnPnl, BorderLayout.SOUTH);
        btnPnl.setLayout(flow);
        btnPnl.setBackground(Color.black);
        btnPnl.add(beginBtn);
        beginBtn.setVisible(false);
        btnPnl.add(carBtn);
        carBtn.setVisible(false);
        btnPnl.add(exitBtn);

        nameField.setVisible(false);
        lastName.setVisible(false);
        carBtn.addActionListener(this);
        carBtn.setVisible(false);
        rentalPnl.add(carBtn, BorderLayout.SOUTH);
        rentalPnl.add(nameField);
        rentalPnl.add(lastName);
        rentalPnl.setLayout(flow);
        cont.add(rentalPnl);

        // for logo//
                Icon b = new ImageIcon(getClass().getResource("myDrive.png"));
                custom= new JButton(b);
                welcomePnl.add(custom);

                welcomePnl.add(yesBox);
                welcomePnl.add(noBox);

                yesBox.addActionListener(this);
                noBox.addActionListener(this);

        //carPnl.add(carLbl, BorderLayout.NORTH);
        brandPnl.setLayout(grid1);
        brandPnl.setVisible(false);
        brandPnl.setBackground(Color.GRAY);
        brandPnl.add(brand1);
        brandPnl.add(brand2);
        brandPnl.add(brand3);
        brandPnl.add(brand4);
        brandPnl.add(brand5);

        colorPnl.setLayout(grid1);
        colorPnl.setVisible(false);
        colorPnl.setBackground(Color.GRAY);
        colorPnl.add(color1);
        colorPnl.add(color2);
        colorPnl.add(color3);
        colorPnl.add(color4);

        carPnl.add(drive1);
        carPnl.add(drive2);
        carPnl.setVisible(false);
        cont.add(brandPnl, border.EAST);
        cont.add(colorPnl, border.WEST);
        cont.add(carPnl);
        carLbl.setVisible(false);
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object source = e.getSource();

        if (source == yesBox)
        {
            beginBtn.setVisible(true);
        }

        if (source == noBox)
        {
            System.exit(0);
        }

        if (source == beginBtn)
        {
            welcomePnl.setVisible(false);
            btnPnl.setVisible(true);
            btnPnl.remove(beginBtn);
            btnPnl.add(carBtn);
            carBtn.setVisible(true);

            rentalPnl.setVisible(true);
            nameField.setVisible(true);
            String fName = nameField.getText();
            lastName.setVisible(true);
            String lName = lastName.getText();
        }

        if (nameField != null & lastName != null && source == carBtn)
        {
            carBtn.setEnabled(true);
            rentalPnl.setVisible(false);
            carLbl.setVisible(true);
            brandPnl.setVisible(true);
            colorPnl.setVisible(true);
            cont.add(carLbl, border.NORTH);
        }

        if (source == exitBtn)
            System.exit(0);
    }

    //Main Method
    //Sets the size of the myDrive screen- size is not resizable (cannot be changed while using program)
    public static void main(String[] args)
    {
        Rental r1 = new Rental(); //new rental
        r1.setSize(600,600);
        r1.setVisible(true);
        r1.setDefaultCloseOperation(EXIT_ON_CLOSE);
        r1.setResizable(false);

        try {
            // to get a connection to the SQL database//
            String dbUrl = "jcbc:mysql://localhost:3306/demo";
            String user = "student";
            String password= "student";

            Connection myConn = DriverManager.getConnection(dbUrl, user, password);
            //a statement object, to execute the SQL query
            Statement myStmt = myConn.createStatement();

            //insert a new employee//
            System.out.println("Inserting a new employee to database\n");

            //using the statement object to insert data, the executeUpdate statemnt is a method to handle any update to the database, can be used for insert, update, and deletes//
            //demo code below//
            /*int rowsAffected = myStmt.executeUpdate(

                    //"insert into employees " + "(last_name, first_name, email, department, salary)" + "values" + "('Wright, 'Eric', '[email protected]', 'HR', 33000.00)"
                    //);

                    "insert into employees " + "(last_name, first_name, email, department, salary)" + "values" + "(" + name2 + "," + name1 + "," + onlinemail + ")"
                    );
            */
            //this will return a result set//
            ResultSet myRs = myStmt.executeQuery("select * from employees order by last_name");

            // Process the result set, reads data from each row

            // getter method to print out the last and first name from the result set//
            while (myRs.next())
            {
                System.out.println(myRs.getString("last_name") + ", " + myRs.getString(("first_name")));
            } 

            }

            catch (Exception exc) {
                exc.printStackTrace();
            }
            /*
            finally {

                if (myRs != null)
                {
                    myRs.close();
                }
            }
            */
        }

    public String getBrand() 
    {
        return null;
    }

    @Override
    public String getColor() 
    {
        return null;
    }

    @Override
    public int getYear() 
    {
        return 0;
    }

    @Override
    public int getMiles() 
    {
        return 0;
    }

    @Override
    public String getDriveType() 
    {
        return null;
    }
}

Этот код устанавливает четыре отдельные панели на CENTER панели с BorderLayout. Два явно и два других по умолчанию (из-за того, что параметр не указан при добавлении). Какие из четырех компонентов вы ожидаете появиться в пространстве, которое может отображать ровно один? Кстати - для получения более качественной помощи опубликуйте минимальный воспроизводимый пример или Краткий, автономный, правильный пример.

Andrew Thompson 07.05.2018 08:59

Если вы посмотрите, панели используются в разное время. Некоторые панели не становятся видимыми, пока не будут нажаты кнопки на экране.

Matt LeClair 07.05.2018 09:14
"Если вы посмотрите ..." Если бы вы разместили MCVE, я бы посмотрел более внимательно, и MCVE, вероятно, не добавлял бы 4 панели в одну область контейнера.
Andrew Thompson 07.05.2018 09:31

Я просто ищу помощь в том, где я ошибся. Я понимаю, что мой код добавляет несколько панелей в центр, но если есть другой способ сделать это, я очень открыт для предложений и помощи. У меня просто были проблемы с добавлением в центр, так как ничего не появлялось.

Matt LeClair 07.05.2018 16:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
745
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте установить макет перед добавлением компонентов с помощью макета:

    cont.setLayout(border); //border layout for the container
    cont.add(testPanel, BorderLayout.CENTER);

Если вы посмотрите на четвертую строку кода в конструкторе, макет устанавливается на границу

Matt LeClair 07.05.2018 09:15

@MattLeClair, менеджером компоновки по умолчанию для панели содержимого JFrame является BorderLayout. Так что ничего делать не нужно. Проблема с вашим кодом заключается в том, что вы добавляете компоненты во фрейм, а затем сбрасываете диспетчер компоновки, поэтому теперь у вас есть пустой BorderLayout без компонентов для управления. Простое решение - просто избавиться от оператора setLayout (...).

camickr 07.05.2018 16:20

Другие вопросы по теме