2015-09-08 2 views
1

Целью здесь является то, что я могу щелкнуть по цвету и форме, а затем по двум точкам на фигурахPanel. Эта цветная фигура заполняется на фигурахPanel, и я могу добавлять фигуры друг на друга и т. Д. Мне также нужна текущая дата, которая будет отображаться в углу фигурыPanel, поверх всех окрашенных фигур. Я могу создавать фигуры (хотя они всегда охватывают дату) не проблема, но всякий раз, когда я изменяю размер или сворачиваю окно, все окрашенные фигуры исчезают. Я попытался реализовать довольно много разных методов из Graphics (обновление, краска, перерисовка и т. Д.) И не нашел того, что исправляет эту проблему. Я думал, что paintComponent() позаботится обо всем этом, но, по-видимому, нет. Не стесняйтесь указывать на все, что может быть реализовано лучше, всегда рады узнать что-то новое.Рисованная графика мерцает, а затем исчезает при изменении размера окна.

 @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      drawFigures(); 
      figuresPanel.add(dateLabel, c); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return (new Dimension(800, 600)); 
     } 

     private void addFigure(Figure figure) { 
      figureList.add(figure); 
      listArea.append(figure.toString() + "\n"); 
      figure.fill(getGraphics()); 
     } 

     private void drawFigures() { 
      for (Figure f : figureList) { 
       f.fill(getGraphics()); 
      } 
     } 
+2

'getGraphics()' - плохая идея. Посмотрите на [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) и [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting /) для более подробной информации о том, как работает живопись в Swing. – MadProgrammer

ответ

2

Я бы предложил несколько вещей, которые могут вам помочь.

  1. В вашем методе drawFigures() вместо использования getGraphics(), почему бы вам не передать экземпляр Graphics в paintComponentMethod в качестве параметра метода и использовать его, чтобы нарисовать объект. Это позволит убедиться, что вы рисуете один и тот же экземпляр Graphics, который вы используете для рисования.

  2. В вашем методе addFigure(Figure figure) Я бы предложил вам удалить линию figure.fill(getGraphics());, чтобы нарисовать объект полностью. Вместо того, чтобы в вашем mouseClicked(MouseEvent event) метода после вашей вставки switch заявления:

    revalidate(); 
    repaint(); 
    

    Это фактически должно заботиться о чертеже объектов выполняется точно на тот же Graphics объекта, который используются для отображения компонентов.

Я надеюсь, что это будет полезно.

+0

Спасибо, я сейчас начинаю понимать это немного больше. Цените помощь! – Badger

Смежные вопросы