JFrame frame = new JFrame();
Прежде всего, это утверждение в вашем классе View совершенно не нужно.Вы не создали бы экземпляр JFrame в конструкторе компонента.Кроме того, ваш код никогда не ссылается на переменную, что является хорошим признаком того, что она не нужна.
Однако основная проблема в том, что ваша концепция создания пользовательских компонентов неверна:
setPreferredSize(new Dimension(100, 100));
Вы пытаетесьустановите предпочтительный размер компонента.
add(new Triangle(100, 200, Color.pink)); //this one doesn't appear
Но затем вы попытаетесь выполнить пользовательское рисование в (100, 200), который находится за пределами размера компонента.Таким образом, логика рисования обрезается по размеру компонента, поэтому вы не видите ничего нарисованного.
Пользовательское рисование должно выполняться относительно (0, 0) компонента, а не относительно родительского компонента.
Если вы хотите расположить компоненты случайным образом на родительской панели, то вам необходимо:
- настроить родительскую панель на использование нулевого макета
- установить расположение* каждый компонент, добавляемый на панель
- устанавливает размер каждого компонента, добавляемого на панель.
в основном вам необходимо взять на себя функции менеджера компоновки.
Другие проблемы с вашим текущим кодом рисования:
Не вызывайте repaint () в методе рисования.Это по существу вызовет бесконечный цикл рисования.Если вам нужна анимация, вы используете Swing Timer для планирования анимации.
Не вызывайте paintComponent (...) напрямую.Swing вызовет paintComponent (), когда компонент должен быть перекрашен.
Однако я хотел бы предложить, чтобы, если вы хотите рисовать фигуры на панели, тогда вы забудете о создании пользовательских компонентов.Вместо этого вы сохраняете ArrayList тех фигур, которые хотите нарисовать, а затем в методе paintComponent () панели вы перебираете ArrayList для рисования каждой фигуры.
В качестве примера такого подхода рассмотрим пример Draw On Component
, приведенный в Индивидуальные подходы к рисованию .
Примечание:
Если вы действительноЕсли вы хотите обрабатывать события мыши, вам нужно использовать объект Shape для представления ваших фигур для правильного обнаружения попадания.Если вы просто отображаете свою форму как компонент, то попадание мыши будет обнаружено, если вы щелкнете где-нибудь в прямоугольной области компонента, а не только в той части треугольника, которую вы фактически рисуете.Класс Shape
имеет метод contains (...), который можно использовать, чтобы определить, действительно ли вы щелкаете в Shape или нет.
Проверьте Игра с формами для получения дополнительной информации оэто понятие.