繁体   English   中英

JTextField没有出现在网格布局中

[英]JTextField not appearing in 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() setVisible(true);

如果上述代码完成了这些任务,则GUI的大小将不会达到500 x 500,并且不会居中。 每个人都有其自己的最佳方法。

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

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

在此处输入图片说明

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);
    }
}

您只需要添加:

frame.pack()

循环后。

在构造函数的末尾添加一个frame.pack() 这样,布局管理器就可以布局其组件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM