【问题标题】:Painting two squares with JPanel.paintComponent() - wrong size使用 JPanel.paintComponent() 绘制两个正方形 - 尺寸错误
【发布时间】:2016-09-09 08:06:20
【问题描述】:

我正在尝试使用 JPanel 的 paintComponent() 方法绘制两个定义大小的正方形,一个相邻的相邻。 这是我到目前为止所尝试的:

1.边框布局

我尝试在单独的 JPanel 子类中绘制每个正方形,然后将这些 JPanel 添加到 JFrame。

结果:正方形被挤压到 JPanel 的相对两侧:高度符合预期,但宽度最小。

JFrame frame = new JFrame();

GreenPanel greenPanel = new GreenPanel();
frame.getContentPane().add(BorderLayout.WEST, greenPanel);
BluePanel bluePanel = new BluePanel();
frame.getContentPane().add(BorderLayout.EAST, bluePanel);

frame.setSize(500, 350);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

class GreenPanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 100, 100);
    }
}

class BluePanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

2。流式布局

我尝试将我的“子”JPanels 与绘制的正方形添加到“父”JPane,然后调用 JFrame.setContentPane(JPanel)。

结果:正方形在顶部中心区域被绘制为小正方形。

JFrame frame = new JFrame();
JPanel outerPanel = new JPanel();
frame.setContentPane(outerPanel);

GreenPanel greenPanel = new GreenPanel();
outerPanel.add(greenPanel);
BluePanel bluePanel = new BluePanel();
outerPanel.add(bluePanel);

frame.setSize(500, 350);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

class GreenPanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 100, 100);
    }
}

class BluePanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

我做错了什么?有什么办法可以强制布局管理器尊重用 paintComponent() 绘制的正方形的大小?

【问题讨论】:

  • 您使用的是布局吗?如果你不知道这个尝试 frame.setLayout(null)。
  • 我看不到您在哪里设置了布局管理器。您需要显式设置布局管理器,除非您使用默认设置。
  • @Alejandro Cortes 我不会这样做frame.setLayout(null)。它需要为每个组件设置边界。这就是布局管理器的用途。

标签: java swing jframe jpanel


【解决方案1】:

进行以下更改。解释见 cmets。

  JFrame frame = new JFrame();
  //add layout manager. You can achieve the desired layout 
  //with GridLayout, Box layout and others 
  frame.getContentPane().setLayout(new GridLayout(1,2));
  GreenPanel greenPanel = new GreenPanel();
  //set preferred size to the panel 
  greenPanel.setPreferredSize(new Dimension(100,100));
  frame.add(greenPanel);
  BluePanel bluePanel = new BluePanel();
  //set preferred size to the panel 
  bluePanel.setPreferredSize(new Dimension(100,100));
  frame.getContentPane().add(bluePanel);

  //let the frame adapt to the panels size 
  //frame.setSize(500, 350); 
  frame.validate();
  frame.pack();
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

如有需要,请随时要求澄清。


(实际上并不需要覆盖paintComponent(Graphics g)。您可以简单地为每个JPanel 设置首选大小和颜色)

【讨论】:

  • 非常感谢!这很好用。我不知道 GridLayout。
  • 很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多