Реализация BoxLayout в Java Swing

Играю со Swing. Ниже приводится моя первая попытка использовать Swing, простой графический интерфейс для решателя квадратных уравнений. Программа работала нормально, когда я использовал FlowLayout, но визуализация была не такой хорошей, когда я изменил размер кадра. Итак, я хотел поместить все метки и текс-поля в myFrame в виде столбцов по центру и решил попробовать BoxLayout. Но когда я выбрал BoxLayout для лучшего отображения, код не мог быть скомпилирован, и Eclipse выдал мне множество предупреждений.

Я знаю, что есть несколько вопросов, связанных с моей проблемой. И общая причина этих вопросов заключалась в том, что первый аргумент конструктора BoxLayout (в данном случае myFrame) не был инициализирован, когда он был передан конструктору.

Мне кажется, что в моем случае я не совершал этой ошибки, поскольку myFrame был создан до того, как я вызвал конструктор BoxLayout. Не могли бы вы указать мне, что не так с кодом?

Вот код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.Math;

class QuadraticEqSolver implements ActionListener {

    JTextField aCoef, bCoef, cCoef;
    JButton jbtnSolve; 
    JLabel jlabPrompt, jlabA, jlabB, jlabC, jlabEquation, jlabSolution;

    QuadraticEqSolver() {

        // Create a new JFrame container. 
        JFrame myFrame = new JFrame("Solve Quadratic Equations"); 

        // Specify BoxLayout for the layout manager. 
        myFrame.setLayout(new BoxLayout(myFrame, BoxLayout.PAGE_AXIS)); 

        // Give the frame an initial size. 
        myFrame.setSize(240, 120); 

        // Terminate the program when the user closes the application. 
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create text fields for entering coefficients 
        aCoef = new JTextField(10); 
        bCoef = new JTextField(10);
        cCoef = new JTextField(10);

        // Set the action commands for the text field. 
        aCoef.setActionCommand("aCoefficients"); 
        bCoef.setActionCommand("bCoefficients"); 
        cCoef.setActionCommand("cCoefficients"); 

        // Create the Solve button. 
        JButton jbtnSolve = new JButton("Solve the Eq."); 

        // Add action listeners. 
        jbtnSolve.addActionListener(this); 

        // Create the labels. 
        jlabPrompt = new JLabel("Enter coefficients of the equation: "); 
        jlabA = new JLabel("Enter a:");
        jlabB = new JLabel("Enter b:");
        jlabC = new JLabel("Enter c:");
        jlabEquation = new JLabel(""); 
        jlabSolution = new JLabel("");

        // Add the components to the content pane. 
        myFrame.add(jlabPrompt); 
        myFrame.add(jlabA);
        myFrame.add(aCoef);
        myFrame.add(jlabB);
        myFrame.add(bCoef);
        myFrame.add(jlabC);
        myFrame.add(cCoef);

        myFrame.add(jbtnSolve);  
        myFrame.add(jlabEquation);
        myFrame.add(jlabSolution);

        // Display the frame. 
        myFrame.setVisible(true); 

   }

    public void actionPerformed(ActionEvent ae){
        if(ae.getActionCommand().equals("Solve the Eq.")){
            //The Solve the Eq. button was pressed.
            double a = Double.parseDouble(aCoef.getText());
            double b = Double.parseDouble(bCoef.getText());
            double c = Double.parseDouble(cCoef.getText());

            double Delta = Math.pow(b,2) - 4*a*c;
            jlabEquation.setText("Your equation is: " + a + "x^2 + " + b + "x + " + c + " = 0.");

            if(Delta < 0){
                jlabSolution.setText("Your equation does not have real solution!");
            } else if(Delta == 0) {
                double sol = ( -b + Math.sqrt(Delta) )/ ( 2*a );
                jlabSolution.setText("Your equation has one solution x = " + sol);
            } else {
                double sol1 = ( -b - Math.sqrt(Delta) )/ ( 2*a );
                double sol2 = ( -b + Math.sqrt(Delta) )/ ( 2*a );
                jlabSolution.setText("Your equation has two solutions x1 = " + sol1 + "; x2 = " + sol2);
            }
        } else {

        }
    }

    public static void main(String args[]){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new QuadraticEqSolver();
            }
        });
    }
}

и есть предупреждения

Exception in thread "AWT-EventQueue-0" java.awt.AWTError: BoxLayout can't be shared
    at javax.swing.BoxLayout.checkContainer(Unknown Source)
    at javax.swing.BoxLayout.invalidateLayout(Unknown Source)
    at javax.swing.BoxLayout.addLayoutComponent(Unknown Source)
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at QuadraticEqSolver.<init>(QuadraticEqSolver.java:54)
    at QuadraticEqSolver$1.run(QuadraticEqSolver.java:99)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

person Kratos1808    schedule 05.09.2016    source источник
comment
Распространенная ошибка - вы фактически добавляете BoxLayout в contentPane JFrame, и это то, что необходимо передать в первый параметр конструктора BoxLayout. В будущем рассмотрите возможность использования сначала поиск по вашему сообщению об ошибке (щелкните ссылку, чтобы понять, что я имею в виду).   -  person Hovercraft Full Of Eels    schedule 06.09.2016
comment
Кстати, не ваш голосующий   -  person Hovercraft Full Of Eels    schedule 06.09.2016
comment
Решение: myFrame.setLayout(new BoxLayout(myFrame.getContentPane(), BoxLayout.PAGE_AXIS));   -  person Hovercraft Full Of Eels    schedule 06.09.2016
comment
Привет, судно на воздушной подушке, полное угрей, большое спасибо за быстрый ответ! Я понял! В следующий раз буду внимательнее искать вопросы!   -  person Kratos1808    schedule 06.09.2016
comment
Добро пожаловать и удачи.   -  person Hovercraft Full Of Eels    schedule 06.09.2016
comment
Я бы также не стал называть setSize(), а вместо этого вызвал бы pack() в JFrame после добавления всех компонентов и до того, как сделать его видимым. Я бы также, вероятно, использовал GridBagLayout - через минуту я покажу вам, все ли вы там.   -  person Hovercraft Full Of Eels    schedule 06.09.2016
comment
Большое спасибо! Я пробовал pack (). Графический интерфейс выглядит лучше :). Я собираюсь попробовать ваше второе предложение, используя также GridBagLayout!   -  person Kratos1808    schedule 06.09.2016
comment
Например, взгляните на этот пример GridBagLayout.   -  person Hovercraft Full Of Eels    schedule 06.09.2016
comment
Огромное спасибо! Вы такие добрые и у вас потрясающие навыки программирования! Я буду работать над вашим примером и дополню детали!   -  person Kratos1808    schedule 06.09.2016
comment
Я заполнил детали. Программа работала очень хорошо! Я многому научился! Еще раз спасибо :)!   -  person Kratos1808    schedule 06.09.2016