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

Я играю с Swing. Следующее - моя первая попытка с Swing, простым графическим интерфейсом для Quadratic Equations Solver. Программа работала нормально, когда я использую 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)

0 ответов

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