Java 为什么我的JFrame窗口会这样做?(检查说明)
我正在编程一个cookieclicker游戏重拍,当我缩放JFrame窗口时,白色的东西出现了。当你将光标悬停在按钮上(刷新时)它就会消失,我需要修复它,因为当你启动游戏时它也会消失 以下是一个屏幕截图(未缩放): 这是这个游戏的全部代码:Java 为什么我的JFrame窗口会这样做?(检查说明),java,swing,jpanel,preferredsize,Java,Swing,Jpanel,Preferredsize,我正在编程一个cookieclicker游戏重拍,当我缩放JFrame窗口时,白色的东西出现了。当你将光标悬停在按钮上(刷新时)它就会消失,我需要修复它,因为当你启动游戏时它也会消失 以下是一个屏幕截图(未缩放): 这是这个游戏的全部代码: package cookieclicker.tominocz; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.
package cookieclicker.tominocz;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static int num1;
static Icon icon1 = new ImageIcon("cookie.png");
static JButton b1 = new JButton(icon1);
static JButton b2 = new JButton("You got " + num1 + " Cookies!");
@SuppressWarnings("serial")
public static void main(String[] args) {
File save = new File(".\\gamesave.cookieclicker");
if (save.exists()) {
loadGame();
}
JFrame f = new JFrame("Cookie Clicker Beta v0.1");
b2.setBackground(Color.cyan);
b2.setPreferredSize(new Dimension(10000, 14));
JPanel buttonPanel1 = new JPanel(new GridLayout(1, 1));
buttonPanel1.setBackground(Color.DARK_GRAY);
b2.setEnabled(false);
b2.setBorder(null);
buttonPanel1.add(b2);
JPanel buttonPanel2 = new JPanel(new GridLayout(1000, 1));
buttonPanel2.setBackground(Color.DARK_GRAY);
buttonPanel2.setEnabled(false);
buttonPanel2.add(new JButton("Grandma"));
buttonPanel2.add(new JButton(""));
buttonPanel2.add(new JButton(""));
JPanel east = new JPanel(new GridBagLayout());
JPanel north = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTH;
gbc.weighty = 1;
north.add(buttonPanel1, gbc);
east.add(buttonPanel2, gbc);
JPanel center = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
};
center.setBorder(BorderFactory.createLineBorder(Color.BLACK));
f.add(east, BorderLayout.EAST);
f.add(north, BorderLayout.NORTH);
f.add(center);
f.pack();
f.setSize(600, 400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b1.setBackground(Color.lightGray);
b1.setBorder(null);
f.add(b1);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source instanceof JButton) {
addCookies();
}
}
});
}
public static void addCookies() {
saveGame();
b2.setText("You got " + ++num1 + " Cookies!");
if (num1 == 1) {
b2.setText(" You got " + 1 + " Cookie! ");
} else {
b2.setText("You got " + num1 + " Cookies!");
}
System.out.println(num1);
}
public static void saveGame() {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(
".\\gamesave.cookieclicker"));
writer.write(String.valueOf(1 + num1));
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void loadGame() {
try (BufferedReader br = new BufferedReader(new FileReader(
".\\gamesave.cookieclicker"))) {
String SavedGame;
while ((SavedGame = br.readLine()) != null) {
num1 = Integer.parseInt(SavedGame);
b2.setText("You got " + num1 + " Cookies!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
另一件事是,深灰色的条纹隐藏着3个按钮。
不要数第四个,那是显示你有多少饼干的那个:)
现在,问题出在哪里?您有两个组件共享框架的
边框布局的中心位置、中心和b1
b1
是最后添加的组件,正在引起布局管理器的注意,并在调整框架大小时进行布局,center
不是,并且保持在其设置的最后一个大小/位置(因为您调用了pack
,这迫使框架布局其子组件,但随后您在其后面添加了b1
)
BorderLayout
只能在其五个预定义位置的每个位置管理单个组件
决定谁应该在中心
您还应该了解并停止干扰组件的首选大小,让它们与适当的布局管理器一起做出自己的决定
我还鼓励您将main
方法的内容移动到其他地方(可能是类的构造函数)这样,您的字段就不需要是静态的,它解决了您将来可能遇到的大量其他问题。您有两个组件共享框架的边框布局的中心位置,中心位置和b1
b1
是最后添加的组件,正在引起布局管理器的注意,并在调整框架大小时进行布局,center
不是,并且保持在其设置的最后一个大小/位置(因为您调用了pack
,这迫使框架布局其子组件,但随后您在其后面添加了b1
)
BorderLayout
只能在其五个预定义位置的每个位置管理单个组件
决定谁应该在中心
您还应该了解并停止干扰组件的首选大小,让它们与适当的布局管理器一起做出自己的决定
我还鼓励您将main
方法的内容移动到其他地方(可能是类的构造函数),这样,您的字段就不需要是静态的
,它解决了您将来可能遇到的大量其他问题首先:
b2.setPreferredSize(new Dimension(10000, 14));
不要为组件指定首选尺寸。每个组件负责确定其自己的首选尺寸。让布局管理器确定尺寸
JPanel buttonPanel2 = new JPanel(new GridLayout(1000, 1));
定义GridLayout时不要使用随机数。如果需要一列,则只需使用:新建GridLayout(0,1)
。现在添加的所有组件都将显示在第一行中
现在谈谈你的问题:
f.add(center);
f.pack();
将空面板添加到BorderLayout的中心。然后打包框架,使面板现在具有有效的大小
f.add(b1);
但是,然后您将第二个组件添加到“中心”。然而,BorderLayout将只管理最后添加的组件的大小
Swing将绘制()首先添加的最后一个组件,因此将绘制按钮,然后在其顶部绘制面板
如果将鼠标移到中心,则鼠标事件将传递给按钮,并调用翻转逻辑,以便绘制按钮
如果调整框架的大小,布局管理器将重新计算按钮的大小,并重新绘制组件。同样,中央面板最后绘制,因此您可以看到部分按钮的面板位于顶部
我不知道你为什么要安装中央面板,所以我不能提出具体的建议,只能说,扔掉它。同样,主要的问题是你正在尝试向中央添加两个组件。不要这样做!首先:
b2.setPreferredSize(new Dimension(10000, 14));
不要为组件指定首选尺寸。每个组件负责确定其自己的首选尺寸。让布局管理器确定尺寸
JPanel buttonPanel2 = new JPanel(new GridLayout(1000, 1));
定义GridLayout时不要使用随机数。如果需要一列,则只需使用:新建GridLayout(0,1)
。现在添加的所有组件都将显示在第一行中
现在谈谈你的问题:
f.add(center);
f.pack();
将空面板添加到BorderLayout的中心。然后打包框架,使面板现在具有有效的大小
f.add(b1);
但是,然后您将第二个组件添加到“中心”。然而,BorderLayout将只管理最后添加的组件的大小
Swing将绘制()首先添加的最后一个组件,因此将绘制按钮,然后在其顶部绘制面板
如果将鼠标移到中心,则鼠标事件将传递给按钮,并调用翻转逻辑,以便绘制按钮
如果调整框架的大小,布局管理器将重新计算按钮的大小,并重新绘制组件。同样,中央面板最后绘制,因此您可以看到部分按钮的面板位于顶部
我不知道你为什么有中间面板,所以我不能提出一个具体的建议,只能说,扔掉它。同样,主要的问题是你正在尝试向中间添加两个组件。不要这样做!白色窗格是你的中心面板。如果你不需要它,请将其删除。哦,这很有帮助。谢谢!:)白色窗格是您的中心面板。如果不需要,请将其移除。哦,这很有用。谢谢!:)好的,但现在我想添加一个按钮,该按钮不会被拉伸。。你在图片上看到的cookie按钮是cookie和整个li