Изменение размера JPanel BorderLayout Java
Я пытаюсь использовать свинг, и у меня есть небольшая проблема, которую мне не удается решить. То, что я хочу сделать, просто: я просто хочу, чтобы JPanel в JFrame использовал BorderLayout. Проблема в том, что моя центральная панель всегда расположена над моей северной панелью. Фактически, независимо от размера, который я задаю для своей северной панели, размер элемента должен составлять около 10 пикселей после начала центральной панели (как на этом изображении).
Примечание: когда я помещаю вторую панель на юг, первая панель имеет достаточно места для рисования, но даже если она имеет больше места, вторая также занимает всего 10 пикселей, что недостаточно (как на этом изображении).
это мой класс конструктора Плато, который расширяет JFrame:
public Plateau(){
super("arkanoid");
this.setLayout(new BorderLayout());
setFocusable(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(affich,BorderLayout.NORTH);
this.getContentPane().add(jeu, BorderLayout.CENTER);
setVisible(true);
this.setResizable(false);
this.setMinimumSize(new Dimension(700,800));
this.setLocationRelativeTo(null);
}
здесь часть моей панели размещена в центре (остальное - изменяемые функции и функции рисования):
public class Jeu extends JPanel {
public Jeu(int score, int plateauX, int balleX, int balleY, boolean perdu){
super();
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
this.setSize(new Dimension(Width,Heigth));
}
}
и вот весь мой класс должен быть на севере:
public class Affich extends JPanel {
public Affich() {
super();
this.setSize(100,100);
}
public void paint(Graphics g){
this.setSize(100,100);
g.drawOval(0, 0, 50, 50);
}
}
Я надеюсь, что я достаточно ясно
1 ответ
НИКОГДА не звоните setSize(...)
или что-нибудь подобное в методе рисования. Эти методы должны использоваться только для рисования и рисования, и если вы попытаетесь изменить состояние размера, вы можете получить порочный круг бесконечных вызовов - установить размер, который вызывает перерисовку, установить размер, вызвать вызовы перерисовки.
Вместо:
- Переопределять paintComponent JPanel, а не рисовать, поскольку краска отвечает не только за рисование JPanel, и переопределение может иметь непреднамеренные последствия для границ JPanel и дочерних компонентов.
- Вызовите суперкомпонент paintComponent в пределах переопределения
- Опять же, делать только рисование в рамках метода рисования
- Не устанавливайте размер, но вместо этого устанавливайте предпочтительный размер и из кода, который вызывается один раз, а не внутри метода рисования.
Например
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.*;
public class MyDrawing {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int affichW = 100;
int affichH = 100;
Affich affich = new Affich(affichW , affichH );
Jeu jeu = new Jeu();
frame.add(affich, BorderLayout.PAGE_START);
frame.add(jeu, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
@SuppressWarnings("serial")
class Jeu extends JPanel {
private static final int JEU_W = 600;
private static final int JEU_H = 450;
public Jeu(int score, int plateauX, int balleX, int balleY, boolean perdu) {
super();
setBorder(BorderFactory.createTitledBorder("Jeu"));
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
} else {
return new Dimension(JEU_W, JEU_H);
}
}
public Jeu() {
this(0, 0, 0, 0, false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// draw with g2 here
}
}
@SuppressWarnings("serial")
class Affich extends JPanel {
private int width = 0;
private int height = 0;
public Affich(int width, int height) {
super();
this.width = width;
this.height = height;
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
} else {
return new Dimension(width, height);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// draw smooth oval
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.drawOval(0, 0, 50, 50);
}
}