JPanel不适合框架

时间:2014-08-14 09:14:22

标签: 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);
    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();

}
}

2 个答案:

答案 0 :(得分:2)

您的代码令人困惑,因为您致电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);
            }
        });

    }

}

答案 1 :(得分:-1)

在构造函数中设置首选大小。

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

    length = 18 * y;
}

然后它会在初始加载时正确显示..

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