如何防止jpanel调整大小?



我想有一个jframe与多个jpanel在其中。我使用gridbag,但每次我调整帧的大小时,其中的所有内容都将被调整和拉伸以适应JFrame。我只想拖放JFrame的大小,但JPanel上的图像要保持完全相同的大小。(所以显示或多或少,但总是保持相同的维度)。

有办法吗?(虽然代码是不需要的,因为这不是一个特定的问题,这里是代码无论如何。我希望网格始终保持精确的尺寸。setSize和setPreferableSize不能工作)

public class SetupBoard extends JFrame {
public SetupBoard() {
int resolution = 10;
System.out.println("This is the SetUpBoard");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);


// setup different Panels //
// BlackPiecePanel //
JPanel bPieceTaken = new JPanel();
JLabel bPieceTakenText = new JLabel("Black Pieces");
bPieceTaken.add(bPieceTakenText);
// WhitePiecePanel //
JPanel wPieceTaken = new JPanel();
JLabel wPieceTakenText = new JLabel("White Pieces");
wPieceTaken.add(wPieceTakenText);
// ChessBoardPanel //
JPanel chessBoard = new JPanel(new GridLayout(8,8));
chessBoard.setSize(new Dimension(300,300));

JLabel[] squares = new JLabel[64];
for (int i = 0; i < 64; i++) {
squares[i] = new JLabel();
squares[i].setBorder(BorderFactory.createLineBorder(Color.black));
chessBoard.add(squares[i]);
}


// Empty Panel left & right //
JPanel ePLeft = new JPanel();
JLabel ePLeftText = new JLabel("empty Panel left");
ePLeft.add(ePLeftText);
JPanel ePRight = new JPanel();
JLabel ePRightText = new JLabel("empty Panel right");
ePRight.add(ePRightText);
ePRight.setBackground(Color.RED);



// Construct Layout //
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();

// left Side //
gc.weightx = 0.1;
gc.weighty = 1.0;
gc.gridx = 0;
gc.gridy = 1;
add(ePLeft, gc);

// middle //
gc.weightx = 0.8;
gc.weighty = 0.1;

gc.gridy = 0;
gc.gridx = 1;
add (bPieceTaken, gc);


gc.weighty = 0.8;
gc.gridy = 1;
gc.fill = GridBagConstraints.BOTH;
add (chessBoard, gc);

gc.weighty = 0.1;
gc.gridy = 2;
gc.fill = GridBagConstraints.BASELINE;
add (wPieceTaken, gc);


// right Side //
gc.weightx = 0.1;
gc.weighty = 1;

gc.gridx = 2;
gc.gridy = 1;
add (ePRight, gc);

setVisible(true);
System.out.println (chessBoard.getSize());
}

您可以尝试构建自己的LayoutManager,然后您将完全控制您的组件如何调整大小以及每次容器调整大小时它们的位置。您应该通过创建一个实现LayoutManger接口的类来实现这一点,并根据您的设计在其中实现所需的方法。

如果你还没有这样做,你可以看到这篇关于这个主题的oracle文章:
创建自定义布局管理器

最新更新