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大小,但不改变矩形的颜色吗?