Нарисуйте точку / линию на текущем Jframe [дубликат]

Примечание. Ниже применимо к Python 3.3+, поскольку оно использует yield_from . six также является сторонним пакетом, хотя он стабилен. В качестве альтернативы вы можете использовать sys.version.


В случае obj = [[1, 2,], [3, 4], [5, 6]] все решения здесь хороши, включая понимание списка и itertools.chain.from_iterable.

Однако рассмотрим этот несколько более сложный случай:

>>> obj = [[1, 2, 3], [4, 5], 6, 'abc', [7], [8, [9, 10]]]

Здесь есть несколько проблем:

  • Один элемент 6 - это просто скаляр; это не будет истребимым, поэтому приведенные выше маршруты не сработают здесь.
  • Один элемент 'abc', является технически итерируемым (все str s). Тем не менее, чтение между строками немного, вы не хотите рассматривать его как таковое - вы хотите рассматривать его как один элемент.
  • Последний элемент [8, [9, 10]] сам является вложенным итерабельным , Исходное понимание списка и chain.from_iterable извлекают только «1 уровень вниз».

Вы можете исправить это следующим образом:

>>> from collections import Iterable
>>> from six import string_types

>>> def flatten(obj):
...     for i in obj:
...         if isinstance(i, Iterable) and not isinstance(i, string_types):
...             yield from flatten(i)
...         else:
...             yield i


>>> list(flatten(obj))
[1, 2, 3, 4, 5, 6, 'abc', 7, 8, 9, 10]

Здесь вы проверяете, -элемент (1) повторяется с помощью Iterable , ABC из itertools, но также должен гарантировать, что (2) элемент не "string-like . "

2
задан TU_HEO DAKAI 18 April 2012 в 15:32
поделиться

2 ответа

.. нарисуйте 2 строки

Это похоже на суть вопроса в этом вопросе.

Сохраняйте набор строк в расширяемом списке (например, ArrayList) при нажатии / перетаскивании, добавлении новой строки в список и вызове repaint(). В paintComponent(Graphics) повторите сбор и рисуйте каждую строку.

BTW - Я предполагаю, что вы не минимизировали и не восстановили свое окно во время тестирования. Ваши строки (красивые или уродливые) исчезнут!


.. они исчезли. В чем причина?

Методы paint() и paintComponent() вызываются всякий раз, когда GUI нужно перерисовывать. Они могут быть вызваны после того, как перед окном появится другое окно, затем оно возвращается на передний план. В другой раз после восстановления из минимума.

Параметры сохранения строк включают в себя:

  • Хранить местоположения линий (линий) и перерисовывать их все при каждом запросе (как описано выше). Это может работать для большинства целей.
  • Нарисуйте каждую строку до BufferedImage и поместите изображение (в ImageIcon в) JLabel. Этот подход хорошо работает, если область рисования имеет фиксированный размер & amp; ничто никогда не удаляется и может вмещать ... миллионы линий, дуг, полупрозрачных областей, меньших изображений, текста. Используя изображение как поверхность рендеринга, вам больше не понадобится ArrayList, поскольку все, что вы делаете, это добавьте новую строку в изображение и перерисуйте ярлык, чтобы увидеть новую строку и все предыдущие строки.

.. строка не является прямой.

Это из-за «подсказок рендеринга», используемых при рисовании строки. Экран, сделанный из выровненных рядов пикселей, может только идеально делать вертикальные или горизонтальные линии. Чтобы дать «иллюзию» прямой & amp; непрерывная линия под любым другим углом, требует метода, известного как сглаживание . Прочтите открывающие секции Graphics2D для более подробного объяснения и описания RenderingHints.

4
ответ дан Andrew Thompson 26 August 2018 в 09:15
поделиться

Я не знаю, что у меня вопрос, но если вы хотите провести непрерывную линию. При перетаскивании вам нужно обновить свое последнее место.

@Override
  public void mouseDragged(MouseEvent e) {
    point2 = e.getPoint();
    line2d = new Line2D.Double(point1, point2); 
    point1 = point2;  // add this line
    repaint();
  }
1
ответ дан jellyfication 26 August 2018 в 09:15
поделиться
Другие вопросы по тегам:

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