1

チェス盤を表示する必要があります。JPanel を拡張する BoardPanel クラスと、BoardPanel を含む GamePanel (JPanel も拡張) クラスがあります。GamePanel はすべてのアプリケーション フレームを埋めます。

BoardPanel を常に GamePanel の幅と高さの最小値に等しいサイズの正方形にしたい (GamePanel の幅が高さよりも大きい場合は、左右に空きスペースが必要であり、小さい場合は上下に空きスペースがあるはずです) )。BoardPanel が親パネルの中央に表示されることも重要です。

私は次のように書いた:

public GamePanel() {
    setLayout(new BorderLayout(0, 0));
    boardPanel = new BoardPanel(...);
    this.add(boardPanel, BorderLayout.CENTER);
    ...
}

そしてBoardPanelで:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    int size = Math.min(this.getParent().getHeight(), this.getParent().getWidth());
    this.setSize(size, size);
    ...
}

リサイズはうまくいくのですが、常にGamePanelの左上隅にチェス盤が表示されてしまい(空きスペースはすべてbotかrightに表示されてしまいます)、直し方がわかりません。

何か助けはありますか?前もって感謝します!

4

2 に答える 2

4

を使用して中央に配置しGridBagLayoutます。

中央の正方形パネル

import java.awt.*;
import javax.swing.*;

public class CenteredPanel {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel gui = new JPanel(new GridBagLayout());
                JPanel square = new SquarePanel();
                square.setBackground(Color.RED);
                gui.add(square);

                JFrame f = new JFrame("SquareBoard");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);
                f.add(gui);
                f.setMinimumSize(new Dimension(400,100));
                f.pack();
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class SquarePanel extends JPanel {
    @Override
    public Dimension getPreferredSize() {
        Container c = this.getParent();
        int size = Math.min(c.getHeight(), c.getWidth());
        Dimension d = new Dimension(size,size);
        return d;
    }
}
于 2012-12-05T07:37:28.027 に答える
2
  • new BorderLayout(0,0)単にデフォルトのコンストラクターを使用する必要はありませんBorderLayout

  • 次のようにsetSize()むしろオーバーライドgetPreferredSize()を呼び出さないでください。JPanel

    @Override
    public void getPreferredSize() {
    
            int size = Math.min(this.getParent().getHeight(), this.getParent().getWidth());
    
           return new Dimension(size,size);
    }
    
  • paintComponentまた、これは塗装専用に使用する必要があるため、作業を行うのは決して良いことではありません。

上記が機能しない場合は、SSCCEを使用して、発生している可能性のある特定の問題を説明することをお勧めします。

于 2012-12-05T06:39:35.107 に答える