如何在 swing 中制作自定义尺寸的组件
how to make custom sized components in swing
我有 2 个组件(均派生自 jComponent)。一个是地图,另一个是地图中的领土,如下图所示。
到目前为止,地图是在 1200x800 的固定尺寸上绘制的。对于每个领土,我都有一个点列表,这些点将连接成每个国家/地区的形状。
到目前为止绘制的一切都很好。但是当我点击一个国家时,最后绘制的领土总是被调用。似乎每个领土都是整个地图上的一层。我怎样才能让它工作,如果我点击一个区域,只有这个被点击。这样如果我点击中国,就会调用中国的点击事件?
以下是 2 个组件的代码,希望对您有所帮助:
Map.java
public class Map extends JComponent {
private Collection<Territory> territories;
public Map(Collection<Territory> territories) {
super();
this.territories = territories;
}
@Override
public void paintComponent(Graphics graphics)
{
graphics.setColor(new Color(8, 114, 200));
graphics.fillRect(0, 0, this.getWidth(), this.getHeight());
for (Territory tmp : this.territories) {
TerritoryComponent territoryComponent = new TerritoryComponent(tmp);
this.add(territoryComponent);
}
this.updateUI();
}
}
TerritoryComponent.java
public class TerritoryComponent extends JComponent implements MouseListener {
private Territory territory;
public TerritoryComponent(Territory tmp) {
super();
this.setSize(this.getMaximumSize());
this.addMouseListener(this);
this.territory = tmp;
}
@Override
public void paintComponent(Graphics graphics)
{
for (Patch patch : this.territory.getPatches()) {
ArrayList<Point> points = patch.getPoints();
int x[] = new int[points.size() + 1];
int y[] = new int[points.size() + 1];
for (int i = 0; i < points.size(); i++) {
x[i] = (int) points.get(i).getX();
y[i] = (int) points.get(i).getY();
}
x[points.size()] = (int) points.get(0).getX();
y[points.size()] = (int) points.get(0).getY();
graphics.setColor(new Color(255, 255, 255));
graphics.fillPolygon(x, y, points.size() + 1);
graphics.setColor(new Color(52, 52, 52));
graphics.drawPolyline(x, y, points.size() + 1);
}
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("clicked " + this.territory.getName());
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
And for each territorys I have a list of points,
- 创建一个多边形对象来代表您的每个地区。
- 将每个多边形添加到 ArrayList
- 在 paintComponent() 方法中,您只需遍历 ArrayList 来绘制每个多边形
if I click on a single territory that only this gets clicked.
然后在 mouseClicked(...) 事件中获取鼠标点并遍历包含所有多边形的 ArrayList。然后,您可以使用 Polygon.contains(...) 方法来确定您单击的是哪个地区。
也不要使用updateUI()
方法。只有在更改 LAF 时才应调用该方法。它尤其不应在绘制方法中调用,因为这会导致组件可能重新绘制自身。
我有 2 个组件(均派生自 jComponent)。一个是地图,另一个是地图中的领土,如下图所示。
到目前为止,地图是在 1200x800 的固定尺寸上绘制的。对于每个领土,我都有一个点列表,这些点将连接成每个国家/地区的形状。
到目前为止绘制的一切都很好。但是当我点击一个国家时,最后绘制的领土总是被调用。似乎每个领土都是整个地图上的一层。我怎样才能让它工作,如果我点击一个区域,只有这个被点击。这样如果我点击中国,就会调用中国的点击事件?
以下是 2 个组件的代码,希望对您有所帮助:
Map.java
public class Map extends JComponent {
private Collection<Territory> territories;
public Map(Collection<Territory> territories) {
super();
this.territories = territories;
}
@Override
public void paintComponent(Graphics graphics)
{
graphics.setColor(new Color(8, 114, 200));
graphics.fillRect(0, 0, this.getWidth(), this.getHeight());
for (Territory tmp : this.territories) {
TerritoryComponent territoryComponent = new TerritoryComponent(tmp);
this.add(territoryComponent);
}
this.updateUI();
}
}
TerritoryComponent.java
public class TerritoryComponent extends JComponent implements MouseListener {
private Territory territory;
public TerritoryComponent(Territory tmp) {
super();
this.setSize(this.getMaximumSize());
this.addMouseListener(this);
this.territory = tmp;
}
@Override
public void paintComponent(Graphics graphics)
{
for (Patch patch : this.territory.getPatches()) {
ArrayList<Point> points = patch.getPoints();
int x[] = new int[points.size() + 1];
int y[] = new int[points.size() + 1];
for (int i = 0; i < points.size(); i++) {
x[i] = (int) points.get(i).getX();
y[i] = (int) points.get(i).getY();
}
x[points.size()] = (int) points.get(0).getX();
y[points.size()] = (int) points.get(0).getY();
graphics.setColor(new Color(255, 255, 255));
graphics.fillPolygon(x, y, points.size() + 1);
graphics.setColor(new Color(52, 52, 52));
graphics.drawPolyline(x, y, points.size() + 1);
}
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("clicked " + this.territory.getName());
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
And for each territorys I have a list of points,
- 创建一个多边形对象来代表您的每个地区。
- 将每个多边形添加到 ArrayList
- 在 paintComponent() 方法中,您只需遍历 ArrayList 来绘制每个多边形
if I click on a single territory that only this gets clicked.
然后在 mouseClicked(...) 事件中获取鼠标点并遍历包含所有多边形的 ArrayList。然后,您可以使用 Polygon.contains(...) 方法来确定您单击的是哪个地区。
也不要使用updateUI()
方法。只有在更改 LAF 时才应调用该方法。它尤其不应在绘制方法中调用,因为这会导致组件可能重新绘制自身。