Java 如何向jframe添加多个矩形(尝试以简单的方式编写2048代码)
我已经制作了这个游戏,并希望使用矩形而不是jlabel使我的GUI看起来更好,现在我意识到只有最后绘制的矩形才会显示在GUI上 我已经尝试了不同的布局 我的GUI类:Java 如何向jframe添加多个矩形(尝试以简单的方式编写2048代码),java,jframe,jpanel,Java,Jframe,Jpanel,我已经制作了这个游戏,并希望使用矩形而不是jlabel使我的GUI看起来更好,现在我意识到只有最后绘制的矩形才会显示在GUI上 我已经尝试了不同的布局 我的GUI类: public class GUI_N { private Spiel spiel; private KeyEvent e; private String beste; private int beste1; private DrawingComponent[][] feld;
public class GUI_N
{
private Spiel spiel;
private KeyEvent e;
private String beste;
private int beste1;
private DrawingComponent[][] feld;
GUI_N(){
feld = new DrawingComponent[4][4];
spiel = new Spiel();
beste1 = 0;
beste = "Highscore: "+beste1;
JFrame g=new JFrame("2048 - Main");
g.setSize(500,500);
g.setFocusable(true); //wichtig für KeyListener
g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int i = 0;
int j = 0;
int h = 0;
int l = 0;
while(i<4)
{
while(j<4)
{
if(i==0){
h = 50;
}else if(i==1){
h = 100;
}else if(i==2){
h = 150;
}else if(i==3){
h = 200;
}
if(j==0){
l = 50;
}else if(j==1){
l = 100;
}else if(j==2){
l = 150;
}else if(j==3){
l = 200;
}
feld[i][j] = new DrawingComponent(l,h,50,50);
feld[i][j].setBounds(l,h,50,50);
j++;
}
j=0;
i++;
}
i = 0;
j = 0;
while(i<4)
{
while(j<4)
{
g.add(feld[i][j]);
j++;
}
j=0;
i++;
}
//g.getContentPane().setBackground(new Color(20, 40, 50));
g.setVisible(true);
}
public static void main(String[] args) {
new GUI_N();
}
}
正如我所说,只显示最后绘制的矩形
如何实现这一点?现在,您正在将矩形直接添加到帧中。您应该在中间有一个JPanel层,您可以给它一个LayoutManager(GridLayout是一个很好的选择)来安排所有的矩形 所以你会有这样的想法:
JFrame g = new JFrame("2048 - Main");
// GridLayout (on next line) takes number of rows and columns
JPanel panel = new JPanel(new GridLayout(4, 4));
// ... add all the rectangles to the panel here
g.add(panel);
然后将矩形添加到面板,而不是框架。添加它们时,它们将自动在网格中就位
panel.add(feld[i][j]);
此外,如果您使用GridLayout,它将动态调整组件的大小并使其适合网格,因此它也可以为您节省一些代码,因为您不需要在GUI类中硬编码它们的大小。1)不要忘记在paintComponent(…)
方法上调用super.paintComponent(g)
,这样您就不会中断绘制链。2) 为变量指定有意义的名称(g
与JFrame
名称混淆,将其更改为frame
,例如,因为g
通常用于图形
对象。3)不要使用“幻数”(即,创建一个名为ROWS=4
和COLS=4
的常量,以便while循环更容易理解。4)不要设置任何组件的边界,使用适当的5)小心命名变量x
和y
,因为您可能会遇到奇怪的,有趣但有压力6)不需要有2个嵌套的块,而循环,您可以添加g.add(feld[i][j])代码>在j++
的第一个块上。别忘了把你的程序放在EDT上,参见第2点
panel.add(feld[i][j]);