Java中使用SpringUtilities.makeGrid()遇语法错误,求技术支持
SpringUtilities.makeGrid()语法错误及表单布局解决方法
问题说明
尝试在Java中使用SpringUtilities.makeGrid()创建表单界面,需用到Oracle文档中的对应源码但未找到,当前代码一直返回**"Syntax error on token "makeGrid""**错误。
错误原因分析
- 方法调用位置非法:
SpringUtilities.makeGrid()是方法调用,不能直接写在类的成员区域,必须放在构造函数、普通方法或初始化块内。 - 缺少SpringUtilities类:该类不属于Java标准库,是Oracle Swing教程提供的辅助布局工具类,需要自行引入。
- makeGrid参数缺失:调用方法时未传入必要参数,方法无法执行。
解决方案
步骤1:修正方法调用位置
将SpringUtilities.makeGrid()的调用移至FormPanel构造函数中,在组件添加完成后执行。
步骤2:引入SpringUtilities类
将以下SpringUtilities类源码添加到你的项目中(和FormPanel同包或单独包均可):
import javax.swing.*; import java.awt.*; public class SpringUtilities { public static void makeGrid(Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) { SpringLayout layout; try { layout = (SpringLayout)parent.getLayout(); } catch (ClassCastException exc) { System.err.println("The first argument to makeGrid must use SpringLayout."); return; } Spring xPadSpring = Spring.constant(xPad); Spring yPadSpring = Spring.constant(yPad); Spring initialXSpring = Spring.constant(initialX); Spring initialYSpring = Spring.constant(initialY); int max = rows * cols; Spring[] springsX = new Spring[cols]; Spring[] springsY = new Spring[rows]; for (int i = 0; i < max; i++) { int row = i / cols; int col = i % cols; Component c = parent.getComponent(i); SpringLayout.Constraints cons = layout.getConstraints(c); if (col == 0) { springsX[col] = cons.getConstraint(SpringLayout.WEST); } else { springsX[col] = Spring.max(springsX[col], cons.getConstraint(SpringLayout.WEST)); } if (row == 0) { springsY[row] = cons.getConstraint(SpringLayout.NORTH); } else { springsY[row] = Spring.max(springsY[row], cons.getConstraint(SpringLayout.NORTH)); } } for (int col = 1; col < cols; col++) { springsX[col] = Spring.sum(springsX[col-1], xPadSpring); } for (int row = 1; row < rows; row++) { springsY[row] = Spring.sum(springsY[row-1], yPadSpring); } for (int i = 0; i < max; i++) { int row = i / cols; int col = i % cols; Component c = parent.getComponent(i); SpringLayout.Constraints cons = layout.getConstraints(c); cons.setConstraint(SpringLayout.WEST, springsX[col]); cons.setConstraint(SpringLayout.NORTH, springsY[row]); } SpringLayout.Constraints pCons = layout.getConstraints(parent); pCons.setConstraint(SpringLayout.EAST, Spring.sum(Spring.constant(xPad), springsX[cols-1])); pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(Spring.constant(yPad), springsY[rows-1])); } public static void makeCompactGrid(Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) { SpringLayout layout; try { layout = (SpringLayout)parent.getLayout(); } catch (ClassCastException exc) { System.err.println("The first argument to makeCompactGrid must use SpringLayout."); return; } Spring x = Spring.constant(initialX); for (int c = 0; c < cols; c++) { Spring width = Spring.constant(0); for (int r = 0; r < rows; r++) { Component comp = parent.getComponent(r * cols + c); SpringLayout.Constraints constraints = layout.getConstraints(comp); width = Spring.max(width, constraints.getWidth()); } for (int r = 0; r < rows; r++) { Component comp = parent.getComponent(r * cols + c); SpringLayout.Constraints constraints = layout.getConstraints(comp); constraints.setX(x); } x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad))); } Spring y = Spring.constant(initialY); for (int r = 0; r < rows; r++) { Spring height = Spring.constant(0); for (int c = 0; c < cols; c++) { Component comp = parent.getComponent(r * cols + c); SpringLayout.Constraints constraints = layout.getConstraints(comp); height = Spring.max(height, constraints.getHeight()); } for (int c = 0; c < cols; c++) { Component comp = parent.getComponent(r * cols + c); SpringLayout.Constraints constraints = layout.getConstraints(comp); constraints.setY(y); } y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad))); } SpringLayout.Constraints pCons = layout.getConstraints(parent); pCons.setConstraint(SpringLayout.SOUTH, y); pCons.setConstraint(SpringLayout.EAST, x); } }
步骤3:补全makeGrid调用参数
根据表单结构,调用makeGrid时传入合适参数,示例:
SpringUtilities.makeGrid(this, 4, 2, 5, 5, 5, 5);
参数说明:
this:当前容器(FormPanel)4:行数(对应4个标签)2:列数(标签+输入框/组件)5,5:初始X、Y间距5,5:组件间X、Y间距
修正后的完整代码
package FrontEnd.Panel; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import FrontEnd.Interface.setButton; import javax.swing.*; import java.awt.*; public class FormPanel extends JPanel implements ActionListener, setButton { JLabel labelForForm[]; JTextField textFieldForForm[]; public FormPanel() { labelForForm = new JLabel[4]; textFieldForForm = new JTextField[3]; createFormElements(); setLayout(new SpringLayout()); setVisible(true); setBorder(BorderFactory.createLineBorder(Color.RED)); // 移到构造函数内并补全参数 SpringUtilities.makeGrid(this, 4, 2, 5, 5, 5, 5); } public void createFormElements() { String[] labelText = { "Inserisci nome", "Inserisci cognome", "Inserisci data di nascita", "Seleziona reparto" }; for (int i = 0; i < labelForForm.length; i++) { labelForForm[i] = new JLabel(labelText[i]); add(labelForForm[i]); if (i < labelForForm.length - 1) { textFieldForForm[i] = new JTextField(16); add(textFieldForForm[i]); } } setFormElements(); } public void setFormElements() { } @Override public void setButton() { // TODO Auto-generated method stub } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }
内容的提问来源于stack exchange,提问作者mirkzx
相关产品推荐
相关产品推荐

