JButtons 在悬停之前不会加载到面板上?
JButtons don't load on panel until hovered over?
将其放在框架上时,按钮只有在鼠标悬停在其上时才会加载,然后它们会保持正常状态。这是代码:
我已经调用了 repaint() 和 revalidate() 之类的东西,但其中 none 似乎已经解决了问题。主面板和框架与 StartPanel 是分开的 类。谢谢!
JButton[][] levels = new JButton[3][8];
public StartPanel(){
setSize(1600, 1000);
setLayout(null);
int count = 1;
int yValue = 150;
for(int r = 0; r < 3; r++){
for(int c = 0; c < 8; c++){
levels[r][c] = new JButton(String.valueOf(count));
levels[r][c].setLocation(c*190 + 80, yValue);
levels[r][c].setSize(100, 100);
this.add(levels[r][c]);
count++;
}
yValue += 200;
}
}
public static void main(String[] args) {
Frame f = new Frame();
StartPanel sp = new StartPanel();
f.add(sp);
f.setVisible(true);
}
public Frame() {
setSize(1600, 1000);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
setResizable(false);
}
避免使用 null
布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件个体大小的因素太多,none 是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
网格布局
我可能建议尝试 GridLayout
,结合 EmptyBorder
之类的东西,你应该能够接近你想要的东西,例如......
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
JButton[][] levels = new JButton[3][8];
public TestPane() {
setBorder(new EmptyBorder(40, 40, 40, 40));
setSize(1600, 1000);
setLayout(new GridLayout(0, 8, 40, 40));
int count = 1;
int yValue = 150;
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 8; c++) {
levels[r][c] = new JButton(String.valueOf(count));
levels[r][c].setMargin(new Insets(50, 50, 50, 50));
this.add(levels[r][c]);
count++;
}
yValue += 200;
}
}
}
}
有关详细信息,请参阅 How to Use GridLayout
GridBagLayout
另一种解决方案可能是使用 GridBagLayout
,它更灵活,但也更复杂,例如...
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
JButton[][] levels = new JButton[3][8];
public TestPane() {
setSize(1600, 1000);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(25, 25, 25, 25);
gbc.fill = GridBagConstraints.BOTH;
int count = 1;
for (int r = 0; r < 3; r++) {
gbc.gridx = 0;
for (int c = 0; c < 8; c++) {
levels[r][c] = new JButton(String.valueOf(count));
levels[r][c].setMargin(new Insets(50, 50, 50, 50));
this.add(levels[r][c], gbc);
gbc.gridx++;
count++;
}
gbc.gridy++;
}
}
}
}
有关详细信息,请参阅 How to Use GridBagLayout
将其放在框架上时,按钮只有在鼠标悬停在其上时才会加载,然后它们会保持正常状态。这是代码: 我已经调用了 repaint() 和 revalidate() 之类的东西,但其中 none 似乎已经解决了问题。主面板和框架与 StartPanel 是分开的 类。谢谢!
JButton[][] levels = new JButton[3][8];
public StartPanel(){
setSize(1600, 1000);
setLayout(null);
int count = 1;
int yValue = 150;
for(int r = 0; r < 3; r++){
for(int c = 0; c < 8; c++){
levels[r][c] = new JButton(String.valueOf(count));
levels[r][c].setLocation(c*190 + 80, yValue);
levels[r][c].setSize(100, 100);
this.add(levels[r][c]);
count++;
}
yValue += 200;
}
}
public static void main(String[] args) {
Frame f = new Frame();
StartPanel sp = new StartPanel();
f.add(sp);
f.setVisible(true);
}
public Frame() {
setSize(1600, 1000);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
setResizable(false);
}
避免使用 null
布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件个体大小的因素太多,none 是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
网格布局
我可能建议尝试 GridLayout
,结合 EmptyBorder
之类的东西,你应该能够接近你想要的东西,例如......
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
JButton[][] levels = new JButton[3][8];
public TestPane() {
setBorder(new EmptyBorder(40, 40, 40, 40));
setSize(1600, 1000);
setLayout(new GridLayout(0, 8, 40, 40));
int count = 1;
int yValue = 150;
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 8; c++) {
levels[r][c] = new JButton(String.valueOf(count));
levels[r][c].setMargin(new Insets(50, 50, 50, 50));
this.add(levels[r][c]);
count++;
}
yValue += 200;
}
}
}
}
有关详细信息,请参阅 How to Use GridLayout
GridBagLayout
另一种解决方案可能是使用 GridBagLayout
,它更灵活,但也更复杂,例如...
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
JButton[][] levels = new JButton[3][8];
public TestPane() {
setSize(1600, 1000);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(25, 25, 25, 25);
gbc.fill = GridBagConstraints.BOTH;
int count = 1;
for (int r = 0; r < 3; r++) {
gbc.gridx = 0;
for (int c = 0; c < 8; c++) {
levels[r][c] = new JButton(String.valueOf(count));
levels[r][c].setMargin(new Insets(50, 50, 50, 50));
this.add(levels[r][c], gbc);
gbc.gridx++;
count++;
}
gbc.gridy++;
}
}
}
}
有关详细信息,请参阅 How to Use GridBagLayout