gpt4 book ai didi

Java - jpanel 未显示所有组件

转载 作者:行者123 更新时间:2023-12-02 05:59:50 25 4
gpt4 key购买 nike

我的应用程序遇到了令人沮丧的问题。我想要的(在提供的示例中)是 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 还很陌生,通过谷歌搜索找不到任何类似的问题。

感谢您的帮助!

最佳答案

您的自定义绘画是在 CountryPolygon 类中完成的。由于您使用的是空布局,因此这些组件的默认大小为 (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)的大小。您确实需要使每个组件的大小与父面板的大小相同。

关于Java - jpanel 未显示所有组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22764628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com