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]);
}
}
}
}
您只需添加:
frame.pack()
循环之后。
在构造函数的末尾添加一个frame.pack()
。这将使布局管理器对其组件进行布局。
这段代码有很多问题。您询问的主要问题可以通过添加所有组件来解决,然后在最终调用 setVisible(true);
.
之前调用 pack()
如果上面看到的代码执行这些操作,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);
}
}
我正在为我的一个程序使用网格布局,当我尝试将 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]);
}
}
}
}
您只需添加:
frame.pack()
循环之后。
在构造函数的末尾添加一个frame.pack()
。这将使布局管理器对其组件进行布局。
这段代码有很多问题。您询问的主要问题可以通过添加所有组件来解决,然后在最终调用 setVisible(true);
.
pack()
如果上面看到的代码执行这些操作,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);
}
}