【问题标题】:Java Swing | The last JTextField doesn't sets to custom sizeJava 摇摆 |最后一个 JTextField 未设置为自定义大小
【发布时间】: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);
            }
        }
    }
}

【问题讨论】:

    标签: java swing jtextfield


    【解决方案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,您将随着您不断向程序添加功能,您会发现自己陷入越来越多的麻烦中。

    移除布局管理器后:

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2018-12-21
      • 1970-01-01
      • 2013-06-27
      相关资源
      最近更新 更多