【问题标题】:JTextField not appearing in grid layoutJTextField 未出现在网格布局中
【发布时间】:2018-08-05 21:59:20
【问题描述】:

我正在为我的一个程序使用网格布局,当我尝试将 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]);

                   }
                }
    }
}

【问题讨论】:

    标签: java swing jtextfield layout-manager grid-layout


    【解决方案1】:

    此代码存在许多问题。你问的主要问题,可以通过添加所有组件来修复,然后调用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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      在构造函数末尾添加frame.pack()。这将使布局管理器能够很好地布局其组件。

      【讨论】:

        【解决方案3】:

        你只需要添加:

        frame.pack()
        

        在循环之后。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 2018-07-20
          • 2018-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多