我对如何将文本字段中给出的大小传递到我的大小 int 感到困惑

Am puzzled on how I would be able to pass what is given inside the textfield for size into my size int

package SOS;

import java.awt.Graphics;
import javax.swing.*;

public class BoardPanel extends JPanel {
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("SOS");
        frame.setSize(600, 600);
        
        JLabel sizelabel = new JLabel("Board size:");
        frame.add(sizelabel);
        sizelabel.setBounds(500, 100, 30, 30);

        JTextField boardsize = new JTextField();
        boardsize.setBounds(500, 100, 30, 30);
        frame.add(boardsize);
        String value = boardsize.getText();

        BoardPanel panel = new BoardPanel();
        frame.add(panel);
        
        frame.setVisible(true);
    }
    
    private static final long serialVersionUID = 1L;
    
    static final int size = Integer.parseInt(boardsize.getText());;
    
    static final int cols = size;
    static final int rows = size;
    
    static final int originX = 73/size;
    static final int originY = 97/size;
    static final int cellSize = 300/size;
    }
}

只是无法弄清楚如何将 String value = boardsize.getText(); 传递给静态 final int size = Integer.parseInt(boardsize.getText());; 我尝试弄清楚如何让它不在 main 中,但我迷路了。

我也是 java 的新手,所以整个范围 issue/global 变量问题对我来说是新的。

您问题中的代码无法编译,因为 boardsize 是方法 main 中的局部变量,因此无法从该方法外部访问。因此以下行不编译:

static final int size = Integer.parseInt(boardsize.getText());

参考 this Web page,标题为 Variables,来自 Oracle 的 Java 教程。

Internet 上的第一个 Swing 代码示例全部使用扩展 JPanelJFrame 的 类。这不再需要。因此 BoardPane 不需要扩展 JPanel.

编写任何 GUI 应用程序时都需要遵循一系列步骤 – 不仅仅是 Swing 应用程序。

首先创建应用程序 window。然后将组件添加到 window。然后编写当用户执行特定操作时执行的代码,例如当她在 JTextComponent or when she clicks on a JButton. The code that gets executed in response to a user action is referred to as an event listener.

中输入文本时

这是您的应用程序的重写。用户在 JTextField 中输入一个数字并按下 ENTER 键。这将调用方法 createBoard。请注意,我使用了 method reference。我假设您想创建某种板,所以我创建了一个 JLabels.

的网格
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class BordPane {
    private JFrame frame;

    private void createAndDisplayGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createTopPanel(), BorderLayout.PAGE_START);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void createBoard(ActionEvent event) {
        Object source = event.getSource();
        if (source instanceof JTextField) {
            JTextField textField = (JTextField) source;
            String text = textField.getText();
            int dimension = Integer.parseInt(text);
            JPanel board = new JPanel(new GridLayout(dimension, dimension));
            for (int row = 0; row < dimension; row++) {
                for (int col = 0; col < dimension; col++) {
                    JLabel square = new JLabel("   ");
                    square.setBackground(Color.white);
                    square.setOpaque(true);
                    square.setBorder(BorderFactory.createLineBorder(Color.black));
                    board.add(square);
                }
            }
            frame.add(board, BorderLayout.CENTER);
            frame.pack();
        }
    }

    private JPanel createTopPanel() {
        JPanel topPanel = new JPanel();
        JLabel label = new JLabel("Board size:");
        topPanel.add(label);
        JTextField boardSize = new JTextField(6);
        boardSize.addActionListener(this::createBoard);
        topPanel.add(boardSize);
        return topPanel;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new BordPane().createAndDisplayGui());
    }
}

我建议您阅读 Oracle Java 教程中的整个 Creating a GUI With Swing 线索。