如何从构造函数中获取 JPanel 的宽度和高度?
How can I get a JPanel's width and height from within the constructor?
所以我有一个 class 可以将内容绘制到 JPanel,但为此我需要在构造函数中实例化多边形。但是我现在有点困惑;我创建了 JFrame 并像这样添加了扩展 class "Field" 的 JPanel,
public class mainSetup {
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(600,600);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(new Field());
frame.pack();
}
}
这是 JPanel 的代码:
public class Field extends JPanel implements ActionListener{
public Field(){
System.out.println(getWidth());
}
@Override
public void paintComponent(Graphics g){
System.out.println(getWidth());
}
@Override
public void actionPerformed(ActionEvent arg0) {
repaint();
}
}
为什么在构造函数中调用getWidth() 打印0 而在paintComponent 方法中调用getWidth() returns 594?事实上 - 为什么这些数字中的任何一个都不是我期望的 600?为什么它们会有所不同?
swing 组件在构建时还没有宽度。首先必须将其添加到容器中,之后布局管理器将为组件分配位置和尺寸。
至于为什么不是 600 而是 594 - 每个摆动组件都有 "insets" 被边框占用。它们有一个默认宽度,具体取决于您的 PLAF。在这种情况下,JFrame 内容窗格左侧和右侧的插图可能是 3 和 3 个像素,加起来为 6,并且 600 - 6 = 594.
JPanel默认的LayoutManager是BorderLayout,组件的大小在BorderLayout.layoutContainer中计算,调用构造函数时,BorderLayout.layoutContainer没有调用;
所以我有一个 class 可以将内容绘制到 JPanel,但为此我需要在构造函数中实例化多边形。但是我现在有点困惑;我创建了 JFrame 并像这样添加了扩展 class "Field" 的 JPanel,
public class mainSetup {
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(600,600);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(new Field());
frame.pack();
}
}
这是 JPanel 的代码:
public class Field extends JPanel implements ActionListener{
public Field(){
System.out.println(getWidth());
}
@Override
public void paintComponent(Graphics g){
System.out.println(getWidth());
}
@Override
public void actionPerformed(ActionEvent arg0) {
repaint();
}
}
为什么在构造函数中调用getWidth() 打印0 而在paintComponent 方法中调用getWidth() returns 594?事实上 - 为什么这些数字中的任何一个都不是我期望的 600?为什么它们会有所不同?
swing 组件在构建时还没有宽度。首先必须将其添加到容器中,之后布局管理器将为组件分配位置和尺寸。
至于为什么不是 600 而是 594 - 每个摆动组件都有 "insets" 被边框占用。它们有一个默认宽度,具体取决于您的 PLAF。在这种情况下,JFrame 内容窗格左侧和右侧的插图可能是 3 和 3 个像素,加起来为 6,并且 600 - 6 = 594.
JPanel默认的LayoutManager是BorderLayout,组件的大小在BorderLayout.layoutContainer中计算,调用构造函数时,BorderLayout.layoutContainer没有调用;