Java 摆动 |最后一个 JTextField 未设置为自定义大小

Java Swing | The last JTextField doesn't sets to custom size

我正在创建一个 Word Puzzle Solver。我创建了 for 循环来创建 JTextField“网格”。

创建右下角的最后一个字段时,它不会调整为我输入的大小。它正在调整到框架的大小。

我的代码:

public class SolverGUI {

    int sizeOfRect = 50;
    static int height = 5;
    static int width = 5;
    static JTextField[][] textFields = new JTextField[width][height];
    static JFrame frame = new JFrame("Word Puzzle Solver");

    public void createAndShowGUI() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 800);
        createWordPuzzleArea();
        frame.setVisible(true);
    }
    public void createWordPuzzleArea() {
        for (int i = 0; i < height; i++) {
            for (int i2 = 0; i2 < width; i2++) {
                textFields[i2][i] = new JTextField();
                frame.add(textFields[i2][i]);
                textFields[i2][i].setBounds(10 + (i2 * sizeOfRect), 10 + (i * sizeOfRect), sizeOfRect, sizeOfRect);
            }
        }
    }
}

您可以使用 GridLayout.

而不是自己制作网格

使用 setBounds 让我觉得您使用的是 null-layoutis not right, it might seem like the best and easiest way to make a complex UI, but it isn't, if you don't believe me 。 Swing 必须处理多个 PLAF、OS、屏幕尺寸和分辨率,因此像素完美的 UI 并不好,正如您在示例中看到的那样,一切都崩溃了,因此使用像 GridLayout 这样的布局管理器解决这些问题。

您可以改为这样,避免自己计算每个单元格,让布局管理器为您完成计算:)

import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class GridOfTextFields {
    private JFrame frame;
    private JPanel pane;
    private JTextField[][] fields;
    
    private static final int ROWS = 5;
    private static final int COLS = 5;
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new GridOfTextFields()::createAndShowGUI);
    }
    
    private void createAndShowGUI() {
        frame = new JFrame(getClass().getSimpleName());
        pane = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };
        
        pane.setLayout(new GridLayout(ROWS, COLS, 1, 1));
        
        fields = new JTextField[ROWS][COLS];
        
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                fields[i][j] = new JTextField();
                pane.add(fields[i][j]);
            }
        }
        
        frame.add(pane);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}


为了解释为什么你的代码不起作用是因为你在与布局管理器作斗争,当 运行 你的代码:

使其工作的方法是调用 frame.setLayout(null),再次 不推荐 ,请参阅此 post 的第二段,如果您坚持如果继续使用 null-layout,您会发现自己在不断向程序中添加功能时会遇到越来越多的麻烦。

删除布局管理器后: