Java - jpanel没有显示所有组件

时间:2014-03-31 14:43:31

标签: java swing drawing custom-component

我的应用程序遇到了令人沮丧的问题。我想要的(在提供的示例中,就是这样)是3个填充的矩形,如下所示:

##
 #

唉,只绘制了左上角的矩形。这是我的代码的sscce版本:

import static java.lang.System.out;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;

public class Main {
    public static void main(String args[]) {
        Map map = new Map();

        Point[] poly1 = new Point[] { new Point(10, 10), new Point(40, 10), new Point(40, 40), new Point(10, 40) };
        Point[] poly2 = new Point[] { new Point(50, 10), new Point(80, 10), new Point(80, 40), new Point(50, 40) };
        Point[] poly3 = new Point[] { new Point(50, 50), new Point(80, 50), new Point(80, 80), new Point(50, 80) };

        Point[][] polys = new Point[][] { poly1, poly2, poly3 };

        ShowWindow(polys);
    }


    private static void ShowWindow(Point[][] polys) {
        GameWindow frame = new GameWindow(polys);
        frame.setVisible(true);
    }
}

class GameWindow extends JFrame {   
    public GameWindow(Point[][] polys) {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        MapPanel panel = new MapPanel(polys);
        Container c = getContentPane();
        c.setPreferredSize(panel.getPreferredSize());
        add(panel);
        pack();
    }
}

class MapPanel extends JPanel { 
    public MapPanel(Point[][] polys) {
        setLayout(null);
        for (Point[] poly : polys) {
            CountryPolygon boundaries = new CountryPolygon(poly);
            add(boundaries);
        }
        setBounds(0, 0, 800, 600);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(getBounds().width, getBounds().height);
    }
}

class CountryPolygon extends JComponent {
    private Path2D.Double CountryBounds;

    public CountryPolygon(Point[] points) {
        CountryBounds = GetBoundaries(points);
        setBounds(CountryBounds.getBounds());
    }

    private Path2D.Double GetBoundaries(Point[] points) {       
        Path2D.Double bounds = new Path2D.Double();
        bounds.moveTo(points[0].x, points[0].y);
        for(Point p : points) {
            if(p == points[0]) continue;
            bounds.lineTo(p.x, p.y);
        }
        bounds.closePath();

        return bounds;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setColor(new Color(175, 100, 175));
        g2.fill(CountryBounds);
        g2.dispose();
    }

}

我的真实代码不太像这样,但问题非常相似。您可能想知道我为什么不使用布局管理器。好吧,我正在尝试创建一个类似RISK的游戏,所以我有很多不规则的形状,必须都在正确的位置。

我对Java很新,我通过谷歌搜索找不到一个类似的问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您自定义绘画是在CountryPolygon类中完成的。由于您使用的是null布局,因此这些组件的默认大小为(0,0),因此多边形的绘制在类的边界之外完成,没有什么可看的。

您需要设置每个组件的大小。

不确定,但也许你可以使用Custom Painting Approaches中的方法。 DrawOnComponent示例保留要绘制的矩形的ArrayList。在您的情况下,您可以将其更改为用于保存Shape个对象,然后使用Graphics2D的fillShape(...)方法进行绘制。

编辑:

(30,30)的宽度/高度仍然是错误的

Point[] poly2 = new Point[] { new Point(50, 10), new Point(80, 10), new Point(80, 40), new Point(50, 40) };

你正在使用像(80,10)那样远远超出(30,30)尺寸的点。您确实需要使每个组件的大小与父组件的大小相同。