Мой Java-полигон не рисуется, несмотря на наличие, казалось бы, действительных координат вершин

#java #swing

#java #swing

Вопрос:

Мой учитель заставляет нас писать код для рисования логотипа на экране с использованием awt, swing и класса graphics. Я решил нарисовать символ Google Drive, но застрял на желтой трети.

 public class DriveLogo extends JApplet
{
    public void init()
    {
        JRootPane rootPane = this.getRootPane();    
        rootPane.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
    }

    public void paint(Graphics g)
    {
        int num_rect_points = 4;

        g.setColor(Color.black);
        g.fillRect(0,0,getSize().width, getSize().height);

        /*************************************Yellow 1/3**********************************/
        //Order of vertices: Left, right, lower-right, lower-left
        int p1x1 = 150, p1x2 = 250, p1x3 = 350, p1x4 = 300;

        int p1y1 = 25, p1y2 = 25, p1y3 = 280, p1y4 = 280;

        int[] poly_1_x = {
            p1x1, p1x2, p1x3, p1x4
        };

        int[] poly_1_y = {
            p1y1, p1y2, p1y3, p1y4
        };

        Polygon yellow = new Polygon(poly_1_x, poly_1_y, num_rect_points);


    /*************************************Draw**********************************/

        g.setColor(Color.yellow);
        g.fillPolygon(yellow);
    }
}
  

Это приводит к следующему результату:

введите описание изображения здесь

Должен быть желтый ромб / прямоугольник, наклоненный влево. Я спросил своего преподавателя, и она просмотрела мой код, но не смогла выделить проблему и сказала мне, что он «должен» работать. Однако Should не означает, что это так, и это довольно большая оценка. Провел большую часть двух уроков и загрузил проект на свой домашний компьютер для отладки, но, похоже, я просто не могу понять, в чем проблема.

Вещи, которые я знаю; координаты многоугольника должны быть в порядке, поэтому, чтобы нарисовать прямоугольник, я не могу перечислить их сверху слева, снизу справа, снизу слева, сверху справа, но я могу перечислить их сверху слева, сверху справа, снизу справа, снизу слева.

Комментарии:

1. Пользовательское рисование должно выполняться переопределением paintComponent(), а не paint(). Прочитайте раздел из руководства Swing по пользовательскому рисованию для получения дополнительной информации и рабочих примеров. Мы не знаем контекста выполнения вашего кода, поэтому, если вам нужна дополнительная помощь, опубликуйте соответствующий SSCCE , который демонстрирует проблему.

2. Опубликуйте код для всего вашего класса. Распространенной ошибкой является расширение Frame или JFrame, в то время как ваш main метод создает и отображает новый JFrame, который не является экземпляром вашего класса.

3. @VGR Нет, виноват. Я расширяю JApplet и выполняю весь свой рисунок напрямую, поскольку это только усложнило бы его и добавило шаблонности для использования обычного подхода ООП для такого небольшого проекта.

4. @DJMethaneMan, Better? — Нет, не совсем, потому что вы не потратили время на чтение ссылки и правильную структуру вашего кода. Вы учитесь, выполняя все правильно, а не выбирая короткие пути, которые вызовут проблемы позже, когда код станет более сложным. В любом случае опубликованный код отлично работает для меня, используя appletviewer на JDK8 в Windows 7. Кстати, я бы отказался от любого курса, использующего апплеты, поскольку они больше не поддерживаются в большинстве браузеров.

5. @camickr На самом деле я не вижу, как этот код неправильно отформатирован … мне кажется, все в порядке. И обращаясь к отредактированному сообщению в отношении связанной статьи; Коротко — пример урезан, самодостаточен — все необходимое для запуска кода включено в пример сохранения импорта, Исправлено — я не вижу никаких синтаксических ошибок или действительно каких-либо ошибок. Спасибо за совет 🙂

Ответ №1:

Хорошо, я решил это, поэкспериментировав. По какой-то причине вызов g.fillPolygon(Polygon p) не работал, но когда я вызвал g.fillPolygon(poly_1_x, poly_1_y, num_recto_points); он сработал должным образом.