【问题标题】:JComponents not drawn correctly on JFrame在 JFrame 上未正确绘制 JComponent
【发布时间】:2013-12-27 09:38:22
【问题描述】:

我有扩展 JFrame 的 Main 类和扩展 JComponentCell 类。 CellpaintComponent() 中填充一个矩形(正方形,大小为 50,50)。

我正在尝试利用 JFrame 25 Cell 实例。它们的大小应该是 50,50(与它们绘制的正方形相同),但由于某种原因,当程序启动时,它们都不可见。

但是,当我放大窗口时,突然出现应有的黑色方块。

为什么它们也不显示在较小的 (250,250) 窗口中(程序启动时启动的窗口)?

代码如下:

主类:

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

public class Main extends JFrame
{

    Cell[][] cells = new Cell[5][5];

    public Main(){

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(250,250);
        setTitle("");
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.insets = new Insets(5,5,5,5);

        for(int i=0;i<5;i++){
            gbc.gridy = i+1;
            gbc.gridx = 1;
            for(int j=0;j<5;j++){
                gbc.gridx = j+1;
                cells[i][j] = new Cell();
                add(cells[i][j], gbc);
            }
        }

        setVisible(true);

    }

    public static void main(String[] args)
    {

        Main m = new Main();

    }

}

类单元:

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

public class Cell extends JComponent
{

    public void paintComponent(Graphics g){

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.fillRect(1, 1, 50, 50);

    }

    public Dimension getPreferredSize(){
        return new Dimension(50,50);
    }

}

谢谢

【问题讨论】:

  • 别忘了pack();另见Initial Threads
  • 谢谢,它有效。但是为什么方块没有像我以前那样显示出来呢?为什么 pack() 解决了这个问题?
  • API 解决了这个问题。
  • @josh 之所以有效,是因为 pack 使用内容窗格的首选大小来计算框架的最佳大小,这就是您应该使用它的原因

标签: java swing paintcomponent gridbaglayout


【解决方案1】:

如果您将这些添加到底部,就在setVisbile(true) 之前,它应该可以工作

  setDefaultCloseOperation(EXIT_ON_CLOSE);
  pack();
  setTitle("");
  setVisible(true);

重要的部分是pack() 你不应该设置框架的大小。而是打包它,使其尊重组件的所有首选尺寸

经过测试,效果很好

【讨论】:

  • GridBagLayout 应该尊重首选尺寸,不是吗?如果是这样,我为什么需要打包?
  • 但正因为如此,您将尺寸设置为框架这一事实并没有为所有组件留出足够的空间。
  • 哦,我明白了。所以问题是 JFrame 中没有足够的空间容纳所有单元格,因为我将 Insets 设置为 5、5、5、5,然后没有足够的空间?现在我将 JFrame 的大小设置为 400,400,并且使用 GridBagLayout 和没有 pack() 可以正常工作。
  • 是的,您可能还想从 0,0 而不是 1,1 绘制矩形。在 1,1 处绘制不均匀
  • Now I set the size of the JFrame to 400,400, and with GridBagLayout and without pack() it works fine,不,不需要使用 setSize()。您只需要使用 pack() 方法,它会为您设置框架的大小。
【解决方案2】:

因为您使用了GridBagLayout,所以您会得到这种效果。

您可以在 GridLayout 的帮助下解决这个问题,例如添加类似 next 的组件:

setLayout(new GridLayout(5,5,5,5));

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        cells[i][j] = new Cell();
        add(cells[i][j]);
    }
}

或者按照推荐使用pack()方法。

【讨论】:

  • 为什么 GridBagLayout 会导致问题而 GridLayout 不会?
  • GridLayout 使所有组件的大小相同,并且最初使用组件的首选大小。
  • GridLayout 自行计算/调整单元格大小,如果容器大小较小,如您的情况。如果您使用GridBagConstraintsfill/weightx/weighty 属性,则可以使用GridBagLayout 实现该效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
相关资源
最近更新 更多