Я пытаюсь получить зависание от графического материала (рисование линий, и т. Д.) В Swing. До сих пор все обучающие программы, которые я видел, объявляют класс , который переопределяет paintComponent
, и все методы paintComponent
выполняют некоторые настройки, например, рисуют красный квадрат (хотя, возможно, они рисуют его в другом месте каждый раз) , Или, может быть, они рисуют несколько строк и фигур, но метод paintComponent
делает все сразу.Инкрементальная графика в Swing
Я пытаюсь выяснить: предположим, я хочу нарисовать одну вещь в компоненте , а затем нарисовать что-нибудь еще поверх нее без , стирая то, что я рисовал раньше. Моя первая мысль заключалась в том, чтобы мой paintComponent
переопределить вызов обратного вызова.
import java.awt.*;
import javax.swing.*;
public class DrawTest {
private interface GraphicsAction {
public void action (Graphics g);
}
private static class TestPanel extends JPanel {
private GraphicsAction paintAction;
public void draw (GraphicsAction action) {
paintAction = action;
repaint();
}
@Override
public void paintComponent (Graphics g) {
super.paintComponent (g);
if (paintAction != null)
paintAction.action(g);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame ("DrawTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500,500));
TestPanel p = new TestPanel();
frame.getContentPane().add(p);
frame.pack();
frame.setVisible(true);
p.repaint();
p.draw (new GraphicsAction() {
public void action (Graphics g) {
g.setColor(Color.RED);
g.drawLine(5, 30, 100, 50);
}
});
// in real life, we would do some other stuff and then
// later something would want to add a blue line to the
// diagram
p.draw (new GraphicsAction() {
public void action (Graphics g) {
g.setColor(Color.BLUE);
g.drawLine(5, 30, 150, 40);
}
});
}
public static void main (String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGui();
}
});
}
}
Это не работает. Появляется синяя линия, но нет красной линии. Я угадывание это потому, что repaint()
в draw
вызывает все , чтобы начать сначала, когда я рисую синюю линию, но я не уверен; во всяком случае, я не знаю, как еще получить paintComponent
.
Также, если я положил Thread.sleep(1000)
между двумя звонками p.draw
, Я даже не вижу красную линию на секунду. Так что я совсем не понял о том, как заставить мою графику появляться, когда захочу.
Я провел несколько поисков по «инкрементной графике» в Swing, но ничего не помогает найти решение. Я нашел статью Oracle «Живопись в AWT и Swing», в которой обсуждается переопределение метода update()
для выполнения инкрементной графики, но я не нашел фактических примеров этого.
Так как я могу заставить это делать то, что я хочу? Похоже, что достаточно общей задачи, чтобы был простой способ сделать это, но я не нашел . Я предполагаю, что это должно быть выполнимым, не вызывая getGraphics
, который, в зависимости от других ответов StackOverflow, будет в лучшем случае, вид gauche.
Хорошо, я еще раз рассмотрю статью «Живопись»; Я уже посмотрел на его часть, но я постараюсь более внимательно рассмотреть ее. Bummer, что они испортили форматирование своих примеров кода и имеют ссылку на демоверсию «UpdateDemo», которая не существует. Существуют ли какие-либо ссылки на пример кода, который использует буфер резервного копирования или «BufferedImage» с собственным контекстом «Graphics» (я полагаю, что он не будет использоваться другими компонентами, если я его не допущу); и мне нужно создать экземпляр «Graphics», чтобы заставить его работать? – ajb
Я добавил простой пример, основанный на прямом рисовании действия на буфер поддержки ... – MadProgrammer
Большое спасибо за пример. Мне нужно изучить его дальше. Как часто вызывать недействительность? Из javadoc для 'java.AWT.Component', он будет вызываться всякий раз, когда изменяется информация о компоновке; но если вы не ожидаете изменения размера окна, кажется, что его можно было бы назвать почти ничем, и это может быть достаточно хорошим для моих целей. Или я должен ожидать, что его можно будет вызывать чаще по другим причинам, даже если компонент, содержащий графику, в значительной степени находится в фиксированном месте? – ajb