2016-09-28 7 views
-1

Я создаю приложение Swing. Это своего рода дорожная карта с применением движущегося объекта. Я разделяю компоненты фигуры на две части: JPanel. Один из них - статический компонент JPanel, а второй для динамического компонента JPanel и оба добавлены в mainPanel. Обе панели перекрываются, а для динамической панели компонентов непрозрачность ложна, чтобы сделать ее прозрачной. Когда я перерисовываюсь для панели динамических компонентов, она также вызывает перерисовку для панели статических компонентов. Я не хочу перерисовывать статическую панель компонентов каждый раз, если есть изменения в форме панели динамических компонентов, а статическая форма панели компонентов не должна быть удалена.Рисование фигур на перекрывающихся панелях, одна панель Draw Стационарная и другая Draw Movable

В настоящее время моя логика, как показано ниже. Это псевдокод. Пожалуйста, помогите мне, как рисовать подвижный компонент верхней части статического компонента и рисовать статический компонент один раз при запуске.

public class layeredpanel extends JFrame 
{ 

    private JPanel contentPane; 


    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        layeredpanel frame = new layeredpanel(); 
        frame.setVisible(true); 
       } catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public layeredpanel() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 

     panel.setLayout(new OverlayLayout(panel)); 


     final JPanel layer_1 = new layer1(); 

     layer_1.setOpaque(false); 
     panel.add(layer_1); 


     JPanel layer_2 = new layer2();  
     panel.add(layer_2); 


     Thread thread = new Thread(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       while(true) 
       {try 
       { 
        Thread.sleep(500); 
       } catch (InterruptedException e) 
       { 

        e.printStackTrace(); 
       } 

       layer_1.repaint(); 
      } 
      } 
     }); 

     thread.start(); 



    } 

    class layer1 extends JPanel 
    { 


     @Override 
     public void paintComponent(Graphics g) 
     { 
      // TODO Auto-generated method stub 
      super.paintComponent(g); 
      System.out.println("Paint1"); 
      g.setColor(Color.blue); 
      g.drawRect(30, 20, 40, 40); 
     } 

    } 

    class layer2 extends JPanel 
    { 
     @Override 
     public void paintComponent(Graphics g) 
     { 
      System.out.println("Paint2"); 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 

     g.setColor(Color.green); 
     g.fillRect(30, 20, 20, 20);} 

    } 
} 

Выход: Paint2

Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 

ответ

1

Это способ, свинг покрасочные работы. Когда у вас есть прозрачная панель, родительская панель также должна быть нарисована, чтобы убедиться, что нет артефактов.

Для того, чтобы картина родительской панели более эффективно вы могли бы:

  1. ли картина на BufferedImage первых (при создании класса), а затем просто перекрасить BufferedImage.
  2. Когда вы перекрашиваете верхнюю панель, вы можете сделать repaint(....), чтобы указать область прямоугольника для перерисовки. Затем также перекрашивается только эта часть родительской панели.

Кроме того, не используйте Thread с Thread.sleep() для создания анимации. Если вы хотите анимацию, используйте график Swing Timer, чтобы запланировать перерисовку.