создание инструмента «Перо», перекрашивание - JAVA - PullRequest
1 голос
/ 07 мая 2011

Я пытаюсь создать инструмент пера, используя слушателей мыши:

public void mouseDragged(MouseEvent e) {
            imageL.setCoordinates(originalPos, e.getPoint());
            imageL.repaint();
            originalPos = e.getPoint();
        }

Функция рисования в JLabel (imageL) получает два набора точек, которые позволяют рисовать линии на основе перетаскивания мышью. Единственная проблема заключается в том, что каждый раз, когда выполняется перетаскивание, новый слой не содержит линию, нарисованную от предыдущего перетаскивания мышью. Функция рисования JLabel выглядит следующим образом:

public void paint(Graphics g) {
    super.paint(g); 
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(drawingColour);
    g2d.drawLine(originCors.x,originCors.y,endCors.x,endCors.y);
}

По сути, мой вопрос таков: как мне "добавить" новую строку в текущий слой?

любая помощь будет великолепна, Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Вы хотите рисовать в методе paintComponent JComponent (и JLabel расширяется от JComponent), а не в методе рисования, если только вы не планируете обрабатывать все рисование границ компонента и дочерних элементов. Затем вы можете захотеть, чтобы ваш компонент рисования содержал ArrayList of Point и добавил точки в этот список массивов методом mouseDragged. Затем метод paintComponent может выполнить итерацию по списку и нарисовать все строки. Если все, что вы хотите сделать, это нарисовать одну линию, то пусть JLabel для рисования удерживает обе точки в поле класса.

2 голосов
/ 07 мая 2011

Michael

Для начала, в Swing (JLabel - это компонент Swing, в отличие от более старой библиотеки AWT), рекомендуется переопределить метод paintComponent (а не метод "рисования"). См. Учебные руководства Java: Пользовательская живопись , чтобы узнать, как и почему.

Если вы хотите нарисовать пользовательский список строк, то вам нужно сделать именно это ... а не только "новый". Одним из способов решения этой проблемы является «обновление» изображения с каждой новой строкой, а затем пользовательская раскраска, которая ... это немного быстрее, поскольку вы только «рисуете» каждую строку один раз, за ​​счет использования большего количества памяти "фоновое изображение") ... но эта техника поддается "двойной буферизации", которая позволяет избежать "того мерцания", которое вы получаете, когда рисуете прямо на экран. См. Учебные руководства Java: Работа с изображениями для деталей. Это на самом деле довольно просто.

Я предлагаю вам Google для «примера двойной буферизации Java» (избегайте Rose India, он полон дерьма).

Приветствия. Кит.

...