gpt4 book ai didi

java - 为什么 JPanel 大小是错误的?

转载 作者:行者123 更新时间:2023-12-04 08:07:37 24 4
gpt4 key购买 nike

有扩展 JFrame 的类的构造函数:

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

public class ChessFrame extends JFrame {
public ChessFrame () {
setSize(520, 520);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));

// Add components
getContentPane().add(new Board());
pack();
setVisible(true);
}
}
和扩展 JPanel 的类:
import javax.swing.*;

public class Board extends JPanel {
public Board() {
setSize(new Dimension(520, 520));
}

public void paintComponent(Graphics g) {
super.paintComponent(g);

g.fillRect(0, 0, 520, 520);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(520, 520);
}
}
结果矩形小于 520x520。
enter image description here
黑色矩形的大小约为 496x510。还有更多:
  • getWidth()getHegiht()写在Board里面类,返回 0 和 0(所以这个 JPanel 到 JFrame 的大小是 0x0)
  • 如果我删除 pack() , 边框尺寸变为 496x510(黑色矩形尺寸)

  • 它实际上是官方java教程的复制粘贴: https://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html .
    我做错了什么还是与java有关?如果是第二个,为什么会发生这种情况?
    任何帮助,将不胜感激。

    最佳答案

    enter image description here
    此示例仅在框架(和面板)在屏幕上可见时才尝试建立面板大小。它返回代码中设置的确切大小(300 像素)。

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

    public class ChessBoard extends JPanel {

    int size = 300;
    JLabel sizeLabel = new JLabel();

    ChessBoard() {
    setBackground(Color.CYAN);
    setLayout(new GridBagLayout());
    add(sizeLabel);
    }

    public void showSize() {
    sizeLabel.setText(String.format("%1sx%1s", getWidth(), getHeight()));
    }

    @Override
    public Dimension getPreferredSize() {
    return new Dimension(size,size);
    }

    public static void main(String[] args) {
    Runnable r = () -> {
    ChessBoard cb = new ChessBoard();

    JFrame f = new JFrame(cb.getClass().getSimpleName());
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.setLocationByPlatform(true);

    f.setContentPane(cb);
    f.pack();
    f.setMinimumSize(f.getSize());

    f.setVisible(true);
    // delay showing size until app. is on-screen
    Runnable r1 = cb::showSize;
    SwingUtilities.invokeLater(r1);
    };
    SwingUtilities.invokeLater(r);
    }
    }

    关于java - 为什么 JPanel 大小是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66146851/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com