Java JPanel没有';我不适合这个框架

Java JPanel没有';我不适合这个框架,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,面板不适合框架,当我更改框架尺寸时,会绘制一个新面板。我想面板,以适应,也改变了框架上的大小没有画一个新的面板。 代码如下: import java.awt.*; import javax.swing.*; public class ColorGrid extends JPanel { int length=200; int width=200; double stokastik; public ColorGrid(int x,int y) { setSize(200,200);

面板不适合框架,当我更改框架尺寸时,会绘制一个新面板。我想面板,以适应,也改变了框架上的大小没有画一个新的面板。 代码如下:

import java.awt.*;
import javax.swing.*;

public class ColorGrid extends JPanel {

int length=200;
int width=200;
double stokastik;  
public ColorGrid(int x,int y) {
    setSize(200,200);
    width=18*x;

    length=18*y;
}
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);


    for(int row=0; row <=length;row+=20) {

        for(int col=0; col <=width;col+=20) {

            stokastik= Math.random();
            if(stokastik < 0.25){
                g.setColor(Color.YELLOW);

            }
            else if (stokastik < 0.5) {
                g.setColor(Color.BLUE);   
            } 
            else if (stokastik < 0.75) {
                g.setColor(Color.GREEN);

            } else {

                g.setColor(Color.RED);     
            }
            g.fillRect(row, col, 18, 18);

        }
    }
}


public static void main(String args[]) {



    JFrame frame = new JFrame();
    frame.setBounds(300,300,300,300);
    ColorGrid grid = new ColorGrid(10,10);
    frame.add(grid);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();

}
}
import java.awt.*;
导入javax.swing.*;
公共类ColorGrid扩展了JPanel{
整数长度=200;
整数宽度=200;
双stokastik;
公共颜色网格(整数x,整数y){
设置大小(200200);
宽度=18*x;
长度=18*y;
}
@凌驾
公共组件(图形g){
超级组件(g);

对于构造函数中的(int row=0;row),请设置首选大小

public ColorGrid(int x, int y) {
    setSize(200, 200);
    setPreferredSize(new Dimension(200, 200));
    width = 18 * x;

    length = 18 * y;
}
然后,它将在初始负载时正确显示


正如另一个答案所提到的,也要按比例定义长度和宽度。

您的代码令人困惑,因为您调用了
setBounds/setSize
,但最终,您调用了
pack()
,它只会根据组件的首选大小调整所有内容的大小

正确的方法是覆盖自定义组件中的
getPreferredSize()
。务必避免调用
setSize/setBounds/setLocation
。这是
LayoutManager
的工作

关于重新绘制面板,您没有选择。面板可以独立于您的意愿重新绘制多次。因此,避免重新绘制时颜色变化的唯一方法是预先计算颜色,然后在执行自定义绘制时仅迭代相同的颜色

演示这一点的小代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ColorGrid extends JPanel {

    double stokastik;
    private int width;
    private int length;
    private Dimension preferredSize;
    private Color[][] colors;

    public ColorGrid(int x, int y) {
        width = 20 * x;
        length = 20 * y;
        preferredSize = new Dimension(width, length);
        colors = new Color[x][y];
        for (int row = 0; row < x; row++) {
            for (int col = 0; col < y; col++) {
                stokastik = Math.random();
                if (stokastik < 0.25) {
                    colors[row][col] = (Color.YELLOW);

                } else if (stokastik < 0.5) {
                    colors[row][col] = (Color.BLUE);
                } else if (stokastik < 0.75) {
                    colors[row][col] = (Color.GREEN);

                } else {

                    colors[row][col] = (Color.RED);
                }
            }
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int row = 0; row < colors.length; row++) {
            for (int col = 0; col < colors[row].length; col++) {
                g.setColor(colors[row][col]);
                g.fillRect(row * 20, col * 20, 18, 18);
            }
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return preferredSize;
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ColorGrid grid = new ColorGrid(10, 10);
                frame.add(grid);
                frame.pack();
                frame.setVisible(true);
            }
        });

    }

}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类ColorGrid扩展了JPanel{
双stokastik;
私有整数宽度;
私有整数长度;
私有维度优先选择大小;
私有颜色[][]颜色;
公共颜色网格(整数x,整数y){
宽度=20*x;
长度=20*y;
preferredSize=新尺寸(宽度、长度);
颜色=新颜色[x][y];
对于(int行=0;行
我不确定我是否理解。您希望面板适合JFrame大小,但不改变矩形的颜色吗?