Java 2D: почему мой JPanel не позволяет мне изменить его размер? - PullRequest
1 голос
/ 21 января 2012

Хорошо, поэтому я пытаюсь добавить JPanel в JFrame следующим образом:

            gameClasses[2] = new a2();
            gameClasses[2].setSize(100, 100);
            menu.add(gameClasses[2]);
            menu.setVisible(true);

a2 () - это отдельный класс, который действует как JPanel, и я использую paintComponent для рисования на нем изображений. «Меню» - это JFrame. Моя проблема, когда я вызываю "gameClasses [2] .setSize (100, 100);" он не меняет размер JPanel, но остается того же размера. Кто-нибудь знает, что я делаю неправильно или как это должно быть сделано, потому что, похоже, ни у кого больше нет проблем с этим в Интернете. Спасибо.

РЕДАКТИРОВАТЬ: Вот код, относящийся к меню и a2:

            menu.setSize(swidth / 2 + swidth / 5, sheight / 2 + sheight / 5);
            menu.setLocation((swidth - menu.getWidth()) / 2, (sheight -     menu.getHeight()) / 3);
            menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            menu.setResizable(true);
            menu.remove(main);
            menu.add(gameClasses[0] = new a3());
            menu.add(gameClasses[1] = new a4());
            gameClasses[2] = new a2();
            gameClasses[2].setSize(100, 100);
            gameClasses[2].validate();
            menu.add(gameClasses[2]);
            menu.setVisible(true);

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class a2 extends JPanel {

public static int size = 48;
public static Image grsX = Toolkit.getDefaultToolkit().getImage("tiles/grsX.png");
public static Image grsY = Toolkit.getDefaultToolkit().getImage("tiles/grsY.png");
public static Image grsX1 = Toolkit.getDefaultToolkit().getImage("tiles/grsX1.png");
public static Image grsY1 = Toolkit.getDefaultToolkit().getImage("tiles/grsY1.png");

public a2() {
    System.out.println("a2 loaded...");
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //draw interface
    for(int y = 0; y < a6.ay; y++) {
        for(int x = 0; x < a6.ax; x++) {
            g.drawImage(a5.Tile_Img.get(a5.ID_Tile.get(a6.area[x][y])), x * size, y * size, size, size, this);
            if(x > 0) {
                if(a6.area[x - 1][y].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsX, x * size, y * size, size, size, this);
                }
            }
            if(x < a6.ax - 1) {
                if(a6.area[x + 1][y].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsX1, x * size, y * size, size, size, this);
                }
            }
            if(y > 0) {
                if(a6.area[x][y - 1].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsY, x * size, y * size, size, size, this);
                }
            }
            if(y < a6.ay - 1) {
                if(a6.area[x][y + 1].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsY1, x * size, y * size, size, size, this);
                }
            }
        }
    }
    repaint();
}

}

a3 и a4 - это класс KeyListener и класс MouseListener, которые оба расширяют JPanel

1 Ответ

2 голосов
/ 21 января 2012
  • Макет с большей вероятностью будет соответствовать предпочтительному размеру, чем размеру.
  • Вызов pack() в кадре сделает его минимальным размером, необходимым для отображения компонентов внутри.Позвоните после того, как все будет добавлено.
  • Не звоните setLayout(null) (упоминается в комментарии как «неактуальный» код). Использовать макеты.
...