Как добавить несколько прямоугольников в jframe (пытаясь легко кодировать 2048) - PullRequest
0 голосов
/ 18 мая 2019

Я уже сделал игру и хотел, чтобы мой GUI выглядел лучше с прямоугольниками, а не с jlabels, и теперь я понял, что только последний нарисованный прямоугольник показан на GUI

Я ужепробовал это с разными макетами

мой класс графического интерфейса:

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();
    }  
    } 

мой класс прямоугольника:

public class DrawingComponent extends JComponent
{
    private Graphics2D g2;
    private int wert;

    private int x;
    private int y;
    private int w;
    private int h;

    public DrawingComponent(int px,int py,int pw,int ph)
    {
        x=px;
        y=py;
        w=pw;
        h=ph;
    }
    public void paintComponent(Graphics g)
    {
        g2 = (Graphics2D) g;

        Rectangle rect1 = new Rectangle(x,y,w,h);
        g2.setColor(Color.RED);
        g2.fill(rect1);
    }

    public void setWert(int x)
    {
        wert = x;
    }

    public int getWert()
    {
        return wert;
    }
}

, как я сказал, показан только последний нарисованный прямоугольник.

Как мне этого добиться?

1 Ответ

1 голос
/ 19 мая 2019

Прямо сейчас вы добавляете прямоугольники прямо в ваш кадр.У вас должен быть слой 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.

...