我的应用程序遇到了令人沮丧的问题。我想要的(在提供的示例中,就是这样)是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很新,我通过谷歌搜索找不到一个类似的问题。
感谢您的帮助!
答案 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)尺寸的点。您确实需要使每个组件的大小与父组件的大小相同。