Реализация 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)