2016-03-04 4 views
0

как вызвать paintComponent (Graphics g) метод ??Как вызвать компонент компонента Paint в java

method(){ 
Timer timer = new Timer(); 
timer.schedule(new Class(), 1000,1000); 
} 
public void run() { 
//invoke PaintComponent 
} 

Здесь! это обновленный один минимальный код Я хочу изменить конечную точку строки каждую секунду просто как вызвать paintComponent (Graphics g) метод ??

public class SimpleTest extends TimerTask { 

JFrame frame; 
int count ,x1,y1,x2,y2; 
public void run() { 

    count+=5; 
    x1=count; 
    y1=count; 
    x2=count-1; 
    y2=count-1; 
    // repaint(); i want to invoke paintcomponent method from here , simply to change the end point of line every secd 
} 
void guiMethod(){ 
    frame=new JFrame("Libra's"); 
    frame.setBounds(50, 50, 250, 250); 
    frame.setVisible(true); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(new NewPanel()); 
} 
public static void main(String[] args){ 
SimpleTest c=new SimpleTest(); 
    c.guiMethod(); 

    Timer timer = new Timer(); 
    timer.schedule(new SimpleTest(), 1000,1000); 
} 
} 
class NewPanel extends JPanel{ 
SimpleTest obj=new SimpleTest(); 
@Override 
protected void paintComponent(Graphics g){ 

    Graphics2D g2=(Graphics2D)g; 
    g2.setStroke(new BasicStroke(3)); 

    g.drawLine(120, 120, 70, 80); 


    g.drawLine(120, 120, obj.x1, obj.y1); 

    g.drawLine(120, 120, obj.x2, obj.y2); 
}} 
+0

я хочу, чтобы вызвать метод paintComponent (Графика г) каждый второй –

+0

panel.repaint() –

+0

Сэр @GilbertLeBlanc перерисовки (нет) работ. Не знаете, почему? –

ответ

1

Вот мой графический интерфейс, основанный на вашем графическом интерфейсе.

GUI

Я сделал много изменений в код.

  1. Я распаковал ваш код в отдельные классы GUI, JPanel и TimerTask. Эта распаковка упрощает тестирование каждой части вашего Java-приложения изолированно.

  2. Я включил ваш основной код метода в Runnable и вызвал метод SwingUtilities invokeLater, чтобы запустить свой графический интерфейс Swing. Метод invokeLater ставит создание и выполнение компонентов Swing на Event Dispatch thread. Oracle и я требую, чтобы вы запускали каждое приложение Swing с вызовом метода invokeLater.

  3. В методе guiMethod я перестроил код JFrame, чтобы он выполнялся в правильном порядке. Метод setVisible называется последним. Я использовал метод pack для создания JFrame. Вы не должны указывать размеры компонентов Swing вообще, за исключением случаев, когда вы создаете панель чертежа. Там вы задаете размер панели чертежа, как в моем классе MyPanel.

  4. Я создал метод setEndPoints в вашем классе NewPanel, чтобы передать конечные точки из вашей задачи таймера в JPanel.

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

  6. Я добавил еще один метод invokeLater для вашей задачи таймера. Это гарантирует, что JPanel перекрашивается в поток Event Dispatch.

Вот код. Я надеюсь, что эти изменения и описания помогут вам лучше понять задачу таймера.

package com.ggl.testing; 

import java.awt.BasicStroke; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class SimpleTest { 

    private JFrame frame; 
    private NewPanel newPanel; 

    public void guiMethod() { 
     frame = new JFrame("Libra's"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     newPanel = new NewPanel(); 
     newPanel.setEndPoints(200, 100, 100, 200); 
     frame.add(newPanel); 

     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       SimpleTest c = new SimpleTest(); 
       c.guiMethod(); 

       Timer timer = new Timer(); 
       timer.schedule(c.new SimpleTimerTask(), 1000, 1000); 
      } 
     }; 
     SwingUtilities.invokeLater(runnable); 
    } 

    public class NewPanel extends JPanel { 
     private static final long serialVersionUID = -4695412639313981349L; 

     private int x1, y1, x2, y2; 

     public NewPanel() { 
      this.setPreferredSize(new Dimension(250, 250)); 
     } 

     public void setEndPoints(int x1, int y1, int x2, int y2) { 
      this.x1 = x1; 
      this.y1 = y1; 
      this.x2 = x2; 
      this.y2 = y2; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2 = (Graphics2D) g; 
      g2.setStroke(new BasicStroke(3)); 
      g.drawLine(75, 75, 10, 10); 
      g.drawLine(75, 75, x1, y1); 
      g.drawLine(75, 75, x2, y2); 
     } 
    } 

    public class SimpleTimerTask extends TimerTask {   
     int count; 

     @Override 
     public void run() { 
      count += 5; 
      final int x1 = 200 + count; 
      final int y1 = 100 + count; 
      final int x2 = 100 + count; 
      final int y2 = 200 + count; 
      // repaint(); i want to invoke paint component method from here , simply 
      // to change the end point of line every second 
      Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 
        newPanel.setEndPoints(x1, y1, x2, y2); 
        newPanel.repaint(); 
       } 
      }; 
      SwingUtilities.invokeLater(runnable); 
     } 

    } 

} 
+0

Спасибо. @ GilberLeBlanc сэр, можете ли вы рассказать мне SwingUtilities.invokeLater() зачем это нужно? и почему вы пишете дважды –

+0

@Muhammad Abdullah: метод invokeLater помещает создание и выполнение компонентов Swing в поток [Event Dispatch thread] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch. HTML). Oracle и я требую, чтобы вы запускали каждое приложение Swing с вызовом метода invokeLater. –

+0

Спасибо, Сэр @ Гилберт Ле Блан –

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