2017-03-20 3 views
0

페인트 칠 사용법을 완전히 이해하지 못하는 것 같습니다. 몇 번이나 다른 코드에서 제대로 작동하는 동안 일부 코드에서 다시 칠하지 않는 이유를 알 수 없습니다. 메신저 그래프 그림 클래스를 만들려고합니다. 지금은 y = x입니다. 그러나 그것은 작동하지 않을 것이다. paintcomponent는 한 번 호출 된 것처럼 보였다. 그게 왜?Repaint() 다시 칠하지 않음

public class Graph extends JPanel 
{ 
    private int oldX=0,oldY=0,newX=1,newY=1; 
    public Graph() 
    { 
     invokeInitWindow(); 
    } 
    public void invokeInitWindow() 
    { 
     SwingUtilities.invokeLater(new Runnable() 
       { 
        public void run() 
        { 
         init(); 
        } 
       }); 

    } 
    public void init() 
    { 
     JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(300,300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(this); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public void move() 
    { 
     newY=++newX; 
     oldX=oldY=newX+1; 
    } 
    public void runGraph() 
    { 
     while(newX < 500) 
     { 
      move(); 
      repaint(); 
     } 
    } 
    public static void main(String[] args) 
    { 
     Graph g = new Graph(); 
     g.runGraph(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     g.setColor(Color.BLACK); 
     g.drawLine(oldX, oldY, newX, newY); 
    } 
} 
+1

그것은 있는지 아니었지만, while-loop' 프레임이 너무 빨리 실행되기 전에 프레임이 화면에 표시되기 전에 완료됩니다. – MadProgrammer

답변

0

따라서 장소에 대한 일부 System.out.println 명령을 추가 한 후 기본적으로 경쟁 조건이 있음이 분명했습니다.

즉, while-loop은 매우 빠르게 실행할 수 있었고, 실제로 화면에 표시되기 전에 실제로 완료되어 화면 밖 어딘가에 그림을 그렸습니다. 당신이해야 할 일은

가 ... 뭔가 같은 (그래서 사람이 실제로 그것을 볼 수 있습니다)을 천천히 루프에 약간의 지연을 주입입니다

public void runGraph() { 
    while (newX < 500) { 
     try { 
      Thread.sleep(40); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Graph.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     move(); 
     repaint(); 
    } 
} 

코드 검토

죄송합니다, 스스로 도와 드릴 수 없습니다. 귀하가 작성한 (중대한) 문제점 중 하나는 생성자가 부작용이 있다는 사실입니다. 즉, JFrame을 생성하고 있으며, 언젠가는 미래에 발생합니다. 이것은 당신이 정말로 피하고 싶어하는 것입니다. 생성자는 객체의 상태를 초기화해야합니다.

현재 설정 한 방식대로 의미있는 방식으로 패널을 다시 사용할 수 없습니다.

두 번째로 사용자 지정 그림을 그리기 전에 super.paintComponent을 호출해야합니다. 페인팅은 Swing이 일련의 메소드 호출로 구성되어 있으며 각 메소드는 작지만 중요한 작업을 수행합니다. 정확히 어떤 메소드가 수행 중인지 알지 못하면 작업을 넘겨 받아야합니다. super이라고 부르는 것이 더 간단합니다. 방법.

자랄 수있는 선을 그리려는 것 같아서 move 메서드를 수정하여 선의 시작이 고정되어 있습니다. 나는 당신의 의도가 화면, 어떤 경우에는, 당신이 가지고로 코드를 복원하기 어렵지 않을 것이다 아래로 이동하도록되었을 수도, 난 그냥`당신에게

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Graph extends JPanel { 

    private int oldX = 0, oldY = 0, newX = 1, newY = 1; 

    public Graph() { 
    } 

    public void move() { 
     newY = ++newX; 
//  oldX = oldY = 
     newX += 1; 
    } 

    public void runGraph() { 
     while (newX < 500) { 
      try { 
       Thread.sleep(40); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Graph.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      move(); 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Graph g = new Graph(); 
       JFrame frame = new JFrame(); 
       frame.setPreferredSize(new Dimension(300, 300)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(g); 
       frame.pack(); 
       frame.setVisible(true); 
       Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         g.runGraph(); 
        } 
       }); 
       t.start(); 
      } 
     }); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.drawLine(oldX, oldY, newX, newY); 
    } 
} 
+0

ok, 도움이되는 의견을 보내 주셔서 감사합니다. 실제로 원하는 것은이 줄을 충분히 작은 간격으로 '그래프'로 묶어 놓은 것입니다. 그래프를 그릴 것입니다. 임은 여전히 ​​매번 새로 고침을하기 때문에이 문제에 어려움을 겪고 있습니다. 그래서 나는 작은 선을 움직이는 것이지만 그것이 어디에 머 무르지는 않습니다. – Idan878

+0

페인트는 파괴적입니다. 그래프를 "덩어리"로 그리려면 그 청크의'List'를 유지해야하며'paintComponent'가 호출되면 다시 페인트합니다 – MadProgrammer

관련 문제