У меня проблема с моим приложением. То, что я хочу (в указанном примере, то есть) 3 заполнены прямоугольниками, как это:Java - jpanel, не показывающий все компоненты
##
#
Увы, только верхний левый прямоугольник рисуется. Вот версия 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, и я не мог найти ни одной подобной проблемы при поиске по Google.
Благодарим за помощь!
Это неправильное: я вызываю setBounds() внутри моего класса CountryPolygon, который устанавливает как размер компонента, так и местоположение компонента. Чтобы проверить это, я вызвал System.out.println (getSize()) внутри класса и System.out.println (limits.getSize()) из цикла for внутри класса MapPanel. Оба возвратили width = 30 height = 30 для всех созданных компонентов, что является правильным. –
@OlaviMustanoja, извините, пропущенный это. См. Править. – camickr
Изменение размера всех объектов до 800x600 делает все компоненты видимыми по назначению. Однако я этого не понимаю. Если размер моего jpanel составляет 800x600, а мой код составляет, например, размер poly1 размером 30x30 и местоположение x = 10 y = 10, то почему компонент за пределами границ? –