Java 为什么我的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.

我正在编程一个cookieclicker游戏重拍,当我缩放JFrame窗口时,白色的东西出现了。当你将光标悬停在按钮上(刷新时)它就会消失,我需要修复它,因为当你启动游戏时它也会消失

以下是一个屏幕截图(未缩放):

这是这个游戏的全部代码:

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