调整jpanel borderlayout java的大小



我尝试使用摇摆,我有一个无法解决的问题问题。我想做的很简单:我只想使用BorderLayout在Jframe中jpanel。问题是我的中心面板始终位于我的北部jpanel上方。实际上,无论我给北面板的尺寸如何,都有10个像素,在中央pannel落生之后(就像在此图像上一样(。

注意:当我将第二个面板放置在南方时,第一个面板有足够的位置可以绘制,但是即使它有更多位置,第二个面板也只需占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);
    }
}

我希望我足够清楚

从不在绘画方法中调用 setSize(...)或类似的东西。这些方法应仅用于绘画和绘画,如果您尝试更改尺寸状态,则可以最终获得无尽的呼叫循环 - 设置大小调用重新涂漆,以设置大小,将调用调用。

调用。

而不是:

  • 覆盖jpanel的PaintComponent 不是油漆,因为油漆不仅仅是绘画jpanel,而且覆盖它可能会对jpanel的边界和儿童组件产生意外的后果。
  • 在"覆盖"中调用超级涂料componem
  • 再次,绘画方法中的绘画
  • 不要设置大小,而是设置首选尺寸,并从一次称为绘画方法中的代码中设置。

例如

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

最新更新