Java Swing GUI窗口创建代码编译错误求助(附代码及错误日志)
Java Swing GUI编译错误修复方案
问题背景
在VS Code中开发一个简单Java Swing窗口,需求是包含「OK」「Clear」两个按钮,以及FirstName、LastName两行输入框,但代码出现编译错误。
错误信息
Exception in thread "main" java.lang.Error: Unresolved compilation problem: at JavaProjectTest.src.MainFrame.main(MainFrame.java:83)
原代码
import java.awt.*; import javax.swing.*; import javafx.event.ActionEvent; public class MainFrame extends JFrame{ final private Font mainFont = new Font("Segoe print", Font.BOLD, 18); JTextField tfFirstName, tfLastName; JLabel lbWelcome; public void initialize(){ /********** Form Panel ***************/ JLabel lbFirstName = new JLabel("First Name"); lbFirstName.setFont(mainFont); tfFirstName = new JTextField(); tfFirstName.setFont(mainFont); JLabel lbLastName = new JLabel("Last Name"); lbLastName.setFont(mainFont); tfLastName = new JTextField(); tfLastName.setFont(mainFont); JPanel formPanel = new JPanel(); formPanel.setLayout(new GridLayout(4, 1, 5, 5)); formPanel.add(lbFirstName); formPanel.add(tfFirstName); formPanel.add(lbLastName); formPanel.add(tfLastName); /********** Welcome Label ***************/ lbWelcome = new JLabel(); lbWelcome.setFont(mainFont); /********** Button Panel ***************/ JButton btnOK = new JButton("OK"); btnOK.setFont(mainFont); btnOK.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ // TODO Auto-generated method stub String firstName = tfFirstName.getText(); String lastName = tfLastName.getText(); lbWelcome.setText("Hello " + firstName + " " + lastName); } }); JButton btnClear = new JButton("Clear"); btnClear.setFont(mainFont); btnClear.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tfFirstName.setText(""); tfLastName.setText(""); lbWelcome.setText(""); } }); JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout(new BorderLayout()); mainPanel.setBackground(new Color(128, 128, 255)); mainPanel.add(formPanel, BorderLayout.NORTH); mainPanel.add(lbWelcome, BorderLayout.CENTER); mainPanel.add(buttonsPanel, BorderLayout.SOUTH); add(mainPanel); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.setBackground(new Color(128, 128, 255)); mainPanel.add(formPanel, BorderLayout.NORTH); mainPanel.add(lbWelcome, BorderLayout.CENTER); setTitle("Welcome"); setSize(500, 600); setMinimumSize(new Dimension(300, 400)); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { MainFrame myFrame = new MainFrame(); myFrame.initialize(); } }
问题分析
- 导入错误:错误导入了JavaFX的
javafx.event.ActionEvent,Swing应使用java.awt.event.ActionEvent,同时缺少ActionListener的导入 - 变量使用顺序错误:
mainPanel未声明就被调用设置背景、添加组件,直接导致编译报错 - 按钮面板未添加按钮:创建了
buttonsPanel但未将OK、Clear按钮加入,且BorderLayout不适合放置并排按钮,改用FlowLayout更合理 - 重复创建mainPanel:代码中两次实例化
mainPanel,前面对mainPanel的操作完全无效
修复后的代码
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class MainFrame extends JFrame{ final private Font mainFont = new Font("Segoe print", Font.BOLD, 18); JTextField tfFirstName, tfLastName; JLabel lbWelcome; public void initialize(){ /********** Form Panel ***************/ JLabel lbFirstName = new JLabel("First Name"); lbFirstName.setFont(mainFont); tfFirstName = new JTextField(); tfFirstName.setFont(mainFont); JLabel lbLastName = new JLabel("Last Name"); lbLastName.setFont(mainFont); tfLastName = new JTextField(); tfLastName.setFont(mainFont); JPanel formPanel = new JPanel(); formPanel.setLayout(new GridLayout(4, 1, 5, 5)); formPanel.add(lbFirstName); formPanel.add(tfFirstName); formPanel.add(lbLastName); formPanel.add(tfLastName); /********** Welcome Label ***************/ lbWelcome = new JLabel(); lbWelcome.setFont(mainFont); lbWelcome.setHorizontalAlignment(JLabel.CENTER); /********** Button Panel ***************/ JButton btnOK = new JButton("OK"); btnOK.setFont(mainFont); btnOK.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ String firstName = tfFirstName.getText(); String lastName = tfLastName.getText(); lbWelcome.setText("Hello " + firstName + " " + lastName); } }); JButton btnClear = new JButton("Clear"); btnClear.setFont(mainFont); btnClear.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tfFirstName.setText(""); tfLastName.setText(""); lbWelcome.setText(""); } }); JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 10)); buttonsPanel.add(btnOK); buttonsPanel.add(btnClear); /********** Main Panel ***************/ JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout(10, 10)); mainPanel.setBackground(new Color(128, 128, 255)); mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); mainPanel.add(formPanel, BorderLayout.NORTH); mainPanel.add(lbWelcome, BorderLayout.CENTER); mainPanel.add(buttonsPanel, BorderLayout.SOUTH); add(mainPanel); setTitle("Welcome"); setSize(500, 600); setMinimumSize(new Dimension(300, 400)); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { MainFrame myFrame = new MainFrame(); myFrame.initialize(); }); } }
修复后效果

内容的提问来源于stack exchange,提问作者Farkhod Abdukodirov
相关产品推荐
相关产品推荐

