JPanel показывает только первый добавленный пользовательский JComponent

Вы можете многому научиться, если взглянуть на код официального пакета для введения ( https://extensions.typo3.org/extension/introduction/ ). Пакет может просто установленный над менеджером расширения -> получить предварительно сконфигурированные дистрибутивы

Или вы просто используете его в качестве основы для создания собственного макета. Вам не нужно изобретать колесо;)

0
задан Zachary Boński 20 January 2019 в 12:07
поделиться

2 ответа

Установите границу для Triangle компонентов следующим образом:

public Triangle(int x, int y, Color c)
{
  this.x = x;
  this.y = y;
  this.c = c;
  setPreferredSize(new Dimension(100, 100));
  addMouseListener(this);
  // Set this border to see the boundaries of this component.
  // When you are done, you may remove this.
  setBorder(BorderFactory.createLineBorder(Color.black));
}

Тогда вы сможете лучше понять границы компонентов.

Розовый треугольник не виден, потому что он находится за границей компонента.

p3 треугольник не реагирует на щелчки мыши, потому что это просто рисунок. Только компоненты реагируют на мышь и другие события.

Обратите внимание, что компоненты имеют прямоугольную форму. Итак, прослушиватель мыши, который вы добавили, работает в любом месте компонента; не только в области треугольника.

В этой программе вы рисуете треугольники двумя способами.
1. Добавляя компоненты треугольника. (Например, «добавить (новый треугольник (20, 50, Color.red));»)
2. Рисуя p3 в методе paintComponent().

С точки зрения разработки программного обеспечения, лучше придерживаться одного подхода. В противном случае это может привести к путанице и ошибкам.

0
ответ дан Prasad Karunagoda 20 January 2019 в 12:07
поделиться
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) компонента, а не относительно родительского компонента.

Если вы хотите расположить компоненты случайным образом на родительской панели, вам необходимо:

  1. настроить родительскую панель на использование нулевого макета
  2. установить местоположение каждого компонента Вы добавляете на панель
  3. и задаете размер каждого компонента, который вы добавляете на панель.

В основном вам нужно взять на себя функции менеджера макета.

Другие проблемы с вашим текущим кодом рисования:

  1. Не вызывайте repaint () в методе рисования. Это по существу вызовет бесконечный цикл рисования. Если вам нужна анимация, вы используете Swing Timer для планирования анимации.

  2. Не вызывать paintComponent (...) напрямую. Swing вызовет paintComponent (), когда компонент должен быть перекрашен.

Однако я хотел бы предложить, чтобы, если вы хотите рисовать фигуры на панели, тогда вы забудете о создании пользовательских компонентов. Вместо этого вы сохраняете ArrayList тех фигур, которые хотите нарисовать, а затем в методе paintComponent () панели вы перебираете ArrayList для рисования каждой фигуры.

В качестве примера такого подхода рассмотрим пример Draw On Component, приведенный в Индивидуальные подходы к рисованию .

Примечание:

Если вы действительно хотите иметь возможность обрабатывать события мыши, вам нужно использовать объект Shape для представления ваших фигур для правильного обнаружения попадания. Если вы просто отображаете свою форму как компонент, то попадание мыши будет обнаружено, если вы щелкнете где-нибудь в прямоугольной области компонента, а не только в той части треугольника, которую вы фактически рисуете. Класс Shape имеет метод contains (...), который можно использовать, чтобы определить, действительно ли вы щелкаете в Shape или нет.

Проверьте Игра с формами для получения дополнительной информации об этой концепции.

0
ответ дан camickr 20 January 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: