2014-03-31 2 views
0

У меня проблема с моим приложением. То, что я хочу (в указанном примере, то есть) 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.

Благодарим за помощь!

ответ

2

Вы нестандартная покраска сделана в классе CountryPolygon. Поскольку вы используете нулевой макет, размер по умолчанию этих компонентов равен (0, 0), поэтому покраска ваших полигонов выполняется за пределами класса, и ничего не видно.

Вам необходимо установить размер каждого из этих компонентов.

Не уверен, но, возможно, вы можете использовать подход, найденный в Custom Painting Approaches. Пример DrawOnComponent хранит ArrayList of Rectangles для рисования. В вашем случае вы можете изменить это, чтобы использовать для хранения объектов Shape, а затем использовать метод Graphics2D для fillShape(...).

Edit:

Ширина/высота (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) размер. Вам действительно нужно сделать размер каждого компонента размером родительской панели.

+0

Это неправильное: я вызываю setBounds() внутри моего класса CountryPolygon, который устанавливает как размер компонента, так и местоположение компонента. Чтобы проверить это, я вызвал System.out.println (getSize()) внутри класса и System.out.println (limits.getSize()) из цикла for внутри класса MapPanel. Оба возвратили width = 30 height = 30 для всех созданных компонентов, что является правильным. –

+0

@OlaviMustanoja, извините, пропущенный это. См. Править. – camickr

+0

Изменение размера всех объектов до 800x600 делает все компоненты видимыми по назначению. Однако я этого не понимаю. Если размер моего jpanel составляет 800x600, а мой код составляет, например, размер poly1 размером 30x30 и местоположение x = 10 y = 10, то почему компонент за пределами границ? –

Смежные вопросы