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

Posted

技术标签:

【中文标题】Java 摇摆 |最后一个 JTextField 未设置为自定义大小【英文标题】:Java Swing | The last JTextField doesn't sets to custom size 【发布时间】:2021-11-15 05:08:23 【问题描述】:

我正在创建一个 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);
            
        
    

【问题讨论】:

【参考方案1】:

您可以使用GridLayout,而不是自己制作网格。

使用setBounds 让我觉得你正在使用null-layout 哪个is not right,这似乎是制作复杂用户界面的最佳和最简单的方法,但如果你不这样做,它就不是相信我check this example。 Swing 必须处理多个 PLAF、操作系统、屏幕尺寸和分辨率,因此像素完美的 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) 再次不推荐,请参阅本文的第二段,如果您坚持使用null-layout,您将随着您不断向程序添加功能,您会发现自己陷入越来越多的麻烦中。

移除布局管理器后:

【讨论】:

以上是关于Java 摇摆 |最后一个 JTextField 未设置为自定义大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPanel 中绘图? (摇摆/图形Java)

如何从另一个 java 类中的 jTextField 或 jFormattedTextField 获取数据

Java - 检查 JTextField 是不是为空

Java Swing:JTextField 没有按预期失去焦点

如何只允许在 Java 中的 JTextField 中浮动

java swing JTextField设置PlaceHolder [重复]