#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); он сработал должным образом.