java - JTextField 未出现在网格布局中

标签 java swing jtextfield layout-manager grid-layout

我正在为我的一个程序使用网格布局,当我尝试将 JTextFields 添加到网格时,它根本不显示。如果我尝试以相同的方法添加 JButtons 而不是 JTextFields,它会完美地工作。

    package suDUKO;

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

import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class Gui_Class {
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension blocksize;
    private final  int screenW=(int) (screenSize.getWidth()/2);
    private final  int screenH=(int) (screenSize.getHeight()/2);
    JFrame frame;
    JPanel panel;

        public Gui_Class() {
            frame=new JFrame("Suduko");
            frame.setBounds((int) screenW-500,screenH-500,500,500);
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setVisible(true);
            panel=new JPanel();
            frame.add(panel);
            panel.setVisible(true);

            panel.setLayout(new GridLayout(9, 9));
            JTextField [][] table = new JTextField[9][9];
            for(int m = 0; m < 9; m++) {
                   for(int n = 0; n < 9; n++) {
                      table[m][n]=new JTextField(m+" "+n);
                      table[m][n].setVisible(true);
                      panel.add(table[m][n]);

                   }
                }
    }
}

最佳答案

这段代码存在很多问题。您询问的主要问题可以通过添加所有组件,然后在最后调用 setVisible(true); 之前调用 pack() 来修复。

如果上面的代码执行这些操作,GUI 的大小将不是 500 x 500,并且不会居中。每个人都有自己的最佳方法。

首先,您似乎希望内容 Pane 是方形的 (500 x 500),如果框架是 500 x 500,则不会发生这种情况,因为它有一个标题栏,并且可能有要渲染的边框。然后将 GUI 在屏幕上居中就像 frame.setLocationRelativeTo(null) 一样简单。

您已经将其标记为正确,但只是准备了上面所写内容的示例,所以就在这里!

enter image description here

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

public class Gui_Class {

    JFrame frame;
    JPanel panel;

    public Gui_Class() {
        frame = new JFrame("Suduko");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        panel = new JPanel(new GridLayout(9, 9));
        frame.add(panel);
        //panel.setVisible(true); //unnecessary 

        JTextField[][] table = new JTextField[9][9];
        for (int m = 0; m < 9; m++) {
            for (int n = 0; n < 9; n++) {
                table[m][n] = new SquareTextField(m + " " + n);
                panel.add(table[m][n]);
            }
        }

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            new Gui_Class();
        };
        SwingUtilities.invokeLater(r);
    }
}

class SquareTextField extends JTextField {

    int size = 30;

    SquareTextField(String s) {
        super(s);
        setFont(getFont().deriveFont((float)size));
        int sz = size/6;
        setMargin(new Insets(sz, sz, sz, sz));
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        int w = d.width;
        int h = d.height;
        int max = w>h ? w : h;

        return new Dimension(max, max);
    }
}

关于java - JTextField 未出现在网格布局中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48988618/

相关文章:

java - JGit check out 之前的提交

java - 我可以更改 JComboBox 拇指样式吗?

Java:使 jcombobox 的一项不可选择(如子标题)并编辑该项目的字体

java - 如何修改 JTextField (Swing) 以显示在用户输入文本之前不会消失的提示?

java - 如何在 JTextfield 上添加 command+a?

java - 如何在 jsf 1.2 中使用 DynamicJasper

java - Oracle/Mysql编辑记录量大,有推荐吗?

java - 如何限制输入类型

java - 如何使用 2 个键在 HashMap 或 ArrayList 上获取或设置值

java - 列表模型中元素的类型