Примечание. Ниже применимо к 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 строки
blockquote>Это похоже на суть вопроса в этом вопросе.
Сохраняйте набор строк в расширяемом списке (например,
ArrayList
) при нажатии / перетаскивании, добавлении новой строки в список и вызовеrepaint()
. ВpaintComponent(Graphics)
повторите сбор и рисуйте каждую строку.BTW - Я предполагаю, что вы не минимизировали и не восстановили свое окно во время тестирования. Ваши строки (красивые или уродливые) исчезнут!
.. они исчезли. В чем причина?
blockquote>Методы
paint()
иpaintComponent()
вызываются всякий раз, когда GUI нужно перерисовывать. Они могут быть вызваны после того, как перед окном появится другое окно, затем оно возвращается на передний план. В другой раз после восстановления из минимума.Параметры сохранения строк включают в себя:
- Хранить местоположения линий (линий) и перерисовывать их все при каждом запросе (как описано выше). Это может работать для большинства целей.
- Нарисуйте каждую строку до
BufferedImage
и поместите изображение (вImageIcon
в)JLabel
. Этот подход хорошо работает, если область рисования имеет фиксированный размер & amp; ничто никогда не удаляется и может вмещать ... миллионы линий, дуг, полупрозрачных областей, меньших изображений, текста. Используя изображение как поверхность рендеринга, вам больше не понадобитсяArrayList
, поскольку все, что вы делаете, это добавьте новую строку в изображение и перерисуйте ярлык, чтобы увидеть новую строку и все предыдущие строки.
.. строка не является прямой.
blockquote>Это из-за «подсказок рендеринга», используемых при рисовании строки. Экран, сделанный из выровненных рядов пикселей, может только идеально делать вертикальные или горизонтальные линии. Чтобы дать «иллюзию» прямой & amp; непрерывная линия под любым другим углом, требует метода, известного как сглаживание . Прочтите открывающие секции
Graphics2D
для более подробного объяснения и описанияRenderingHints
.
Я не знаю, что у меня вопрос, но если вы хотите провести непрерывную линию. При перетаскивании вам нужно обновить свое последнее место.
@Override
public void mouseDragged(MouseEvent e) {
point2 = e.getPoint();
line2d = new Line2D.Double(point1, point2);
point1 = point2; // add this line
repaint();
}