Java 摆动 |最后一个 JTextField 未设置为自定义大小
Java Swing | The last JTextField doesn't sets to custom size
我正在创建一个 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);
}
}
}
}
您可以使用 GridLayout.
而不是自己制作网格
使用 setBounds
让我觉得您使用的是 null-layout
而 is not right, it might seem like the best and easiest way to make a complex UI, but it isn't, if you don't believe me 。 Swing 必须处理多个 PLAF、OS、屏幕尺寸和分辨率,因此像素完美的 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)
,再次 不推荐 ,请参阅此 post 的第二段,如果您坚持如果继续使用 null-layout
,您会发现自己在不断向程序中添加功能时会遇到越来越多的麻烦。
删除布局管理器后:
我正在创建一个 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);
}
}
}
}
您可以使用 GridLayout.
而不是自己制作网格使用 setBounds
让我觉得您使用的是 null-layout
而 is not right, it might seem like the best and easiest way to make a complex UI, but it isn't, if you don't believe me 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)
,再次 不推荐 ,请参阅此 post 的第二段,如果您坚持如果继续使用 null-layout
,您会发现自己在不断向程序中添加功能时会遇到越来越多的麻烦。
删除布局管理器后: