Система координат в Java

203
31 декабря 2019, 23:50

По умолчанию начало системы координат находится в верхнем левом углу. Каким образом я могу настроить так, чтобы начало системы координат находилось точно в центре моего созданного окна?

Answer 1

Если речть про java swing, то можно сделать вот так:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // сдвинуть полотно в центр панели
    g.translate(getWidth()/2, getHeight()/2); 
    // нарисовать все то что рисовали тут до этого
    paintStuff(g);
    // сдвинуть полотно обратно
    g.translate(-getWidth()/2, -getHeight()/2);
}

JFrame frame = new JFrame(); 
frame.add(new JPanel(){ 
    @Override 
    protected void paintComponent(Graphics g) { 
        super.paintComponent(g); 
        g.translate(getWidth()/2, getHeight()/2); 
        paintStuff(g); 
        g.translate(-getWidth()/2, -getHeight()/2); 
    } 
 
    private void paintStuff(Graphics g) { 
        for (double i = 0; i < Math.PI*2; i+= Math.PI/6){ 
            int x = (int) (Math.cos(i)*50); 
            int y = (int) (Math.sin(i)*50); 
            int s = 5; 
            g.fillRect(x-s,y-s, s*2, s*2); 
        } 
    } 
}); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
frame.setSize(400, 400); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true);

Вот что получается:

Так же, если лень считать как вернуть состояние обратно, допустим вы еще что-то поворачивали и потом опять двигали, то можно сделать так

super.paintComponent(g);
// создаем дочерний контекст
final Graphics2D g2 = (Graphics2D)g.create();
try {
   // поворачиваем канву
   g2.rotate(0.4); 
   //двигаем её в центр
   g2.translate(getWidth()/2, getHeight()/2); 
   // рисуем
   paintStuff(g2);
} finally {
   // уничтожаем контекст
   g.dispose(); 
}

Результат:

READ ALSO
Jaxb не парсит амперсант &amp; в текстовом поле?

Jaxb не парсит амперсант & в текстовом поле?

Приложение на spring, со слоями web, business и persistence

115
Обработчик нажатий на строку textview

Обработчик нажатий на строку textview

Есть фрагмент в котором я подгружаю данные из firebaseРодительский каталог называется "News" У него есть "ребёнок" news1, news2, newsn

152
Как в Freemarker проверить существования ключа в Map и вывести значения?

Как в Freemarker проверить существования ключа в Map и вывести значения?

Подскажите пожалуйста! Как в Freemarker проверить существования ключа в Map и вывести значения?

140