Переопределить рисование (графика г) Java
У меня есть небольшая проблема с моим GUI в NetBeans. Я рисую изображения (точки), когда пользователь нажимает на JPanel в месте щелчка мыши. Эта часть работает просто отлично. Я храню каждое местоположение изображения в двух различных ArrayList, который содержит местоположение X и местоположение Y. Теперь я хочу удалить последнее изображение, нарисованное на панели, после нажатия кнопки. Поэтому я удалил последний индекс как ArrayList, а затем вызвал repaint(), чтобы нарисовать все изображения из мест в X и Y ArrayList (код ниже).
Что странно, так это то, что мне нужно изменить размер графического интерфейса (перевести его в полноэкранный режим или просто изменить его размер), чтобы нарисованные изображения снова отображались в JPanel, в противном случае панель остается пустой.
Вот части кода, которые затронуты:
public void paint(Graphics g) {
super.paint(g);
for(int i=0;i<=listePointsX.size()-1;i++) {
try{
BufferedImage icon = ImageIO.read(getClass().getResourceAsStream("/myimage.png"));
Graphics graphe = jPanel1.getGraphics();
graphe.setColor(Color.BLACK);
graphe.drawImage(icon, this.listePointsX.get(i),this.listePointsY.get(i), rootPane);
}catch(Exception e1){
}
}
private void jButtonUndoActionPerformed(java.awt.event.ActionEvent evt) {
if(listePointsX.size()>0){
int lastObject= listePointsX.size();
listePointsX.remove(lastObject-1);
listePointsY.remove(lastObject-1);
jPanel1.repaint();
}
else{
}
}
Любая идея, что мне нужно сделать, чтобы "освежить" все это? Я делаю что-то неправильно? Пробовал искать по этому поводу, но не нашел ничего...
2 ответа
Graphics graphe = jPanel1.getGraphics();
НЕ то, как рисование должно работать, вместо этого вы должны переопределить панель paintComponent
метод и нарисовал точки в.
См. Живопись в AWT и Swing и Выполнение пользовательской живописи для более подробной информации о том, как рисование работает в Swing.
Вместо этого ваша панель должна выполнять всю работу, управляя точками в ArrayList
и красить их. Ваш родительский компонент "может" иметь возможность добавлять или удалять точки, если это соответствует вашим требованиям к дизайну, но основная ответственность остается за панелью.
Избегайте выполнения каких-либо длительных или блокирующих операций внутри paint
методы, они должны бежать как можно быстрее. Поскольку изображение никогда не меняется, вы должны просто загрузить его один раз (либо при создании класса, либо когда вам сначала понадобится изображение) и продолжать использовать одну и ту же ссылку.
Хорошо, теперь все работало нормально. Я должен был сделать это так, как ты сказал мне здесь. Я создал новый класс, который расширяет jPanel (ниже). Тогда в моей основной форме пришлось создать объект этого класса. Каждый раз, когда пользователь щелкает, он вызывает этот объект класса Drawing и добавляет элемент в ArrayList (этот объект управляет всем, что касается созданных точек... Это выглядит так:
public class MyDrawingClass extends JPanel {
ArrayList<Integer> arrayListPointX = new ArrayList<>();
ArrayList<Integer> arrayListPointY = new ArrayList<>();
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
try{
BufferedImage icon = ImageIO.read(getClass().getResourceAsStream("/images/dot.png"));
g.setColor(Color.BLACK);
if(arrayListPointX.size()<=0){
...
}
else{
for(int i=0;i<listePointsX.size();i++){
g.setColor(Color.BLACK);
g.drawImage(icon, listePointsX.get(i), listePointsY.get(i), rootPane);
}
}
}catch(Exception e){
...
}
}
Так что, если я хочу "отменить", скажем, мой объект "MyDrawingClass" называется "рисовать". Я могу сделать: draw.arrayListPointX.remove(draw.arrayListPointX.size()-1); и вызовите repaint(); для отображения оставшихся точек.
Спасибо за ваши советы, ценю это!:)