2014-10-22 2 views
0

수정 한 JPanel 클래스를 인스턴스화 할 때 생성자를 통해 파일을 전달합니다. 파일 (XML)이 읽히고 나중에 데이터가 paint 메소드에서 사용됩니다. 그러나 데이터를 구문 분석 한 직후에 repaint()revalidate()을 모두 호출하지만 내 GUI는 완전히 똑같습니다. JFrame을 확장하는 메인 클래스와 JPanel을 확장하는 패널 클래스에서이 메서드를 호출합니다. 내가 말한 것처럼 JFrame을 다시 칠하지 않는 이유는 무엇입니까?

JFileChooser에서 XML 파일을 선택

drawPanel 클래스는 파일에 복용하고 분석 한 후 repaintrevalidate를 호출의 다른 생성자 인스턴스화됩니다. 나는 당신의 시간을 절약하기 위해 대부분의 코드를 생략했다.

public class myCode extends JFrame { 
    public myCode() { 
    super("Roadway Simulator"); 

    setSize(800, 600); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(null); 
    drawie = new drawPanel(); 
    drawie.setSize(new Dimension(width - 200, height)); 
    drawie.setMinimumSize(new Dimension(width - 200, height)); 
    drawie.setMaximumSize(new Dimension(width - 200, height)); 
    drawie.setLocation(0, 0); 
    add(drawie); 

    setVisible(true); 

    try{Thread.sleep(500);revalidate();repaint();}catch(InterruptedException eeee){} 
} 
    public static void main(String[] args){new myCode();} 
} 

가 여기 내 drawPanel 클래스의 :

class drawPanel extends JPanel { 
    boolean drawRoad = false; 
    public drawPanel() { 
    super(); 
    } 
    public drawPanel(Document doc){ 
    super(); 
    //the change in my paint method 
    drawRoad = true; 
    revalidate(); 
    repaint(); 
    } 
    public paint(Graphics g){ 
    super.paint(g); 
    if(drawRoad){ 
     g.setColor(Color.BLACK); 
     g.fillRect(0,0,600,600); 
    } 
    } 
} 

내 코드는 단지 더 많은 세부, 상기와 동일

다음은 메인 클래스 '코드입니다. 내 JFrame을 다시 칠하지 않는 이유는 무엇입니까? 여기

+1

'널 (null)'레이아웃을 사용하지 않도록주의하면서 픽셀 완벽한 레이아웃은 현대적인 UI 디자인의 환상입니다. 구성 요소의 개별 크기에 영향을주는 요소가 너무 많습니다. 어느 요소도 제어 할 수없는 요소가 너무 많습니다. 스윙은 핵심 레이아웃 관리자와 함께 작동하도록 설계되었으므로 문제가 끝나지 않게하고 – MadProgrammer

+0

을 수정하기 위해 더 많은 시간을 소비하게됩니다. [설정 | (최대 | 최소) Java Swing의 크기 메서드?] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumize-methods-in-java-swi) -하지만 귀하의 경우에는 "null"레이아웃을 사용하면 아무 효과가 없습니다 ... – MadProgrammer

답변

4

:

try{Thread.sleep(500);revalidate();repaint();}catch(InterruptedException eeee){} 

는 스윙 이벤트 스레드에서 호출 할 때 Thread.sleep(...)는 스윙 GUI에 무엇을하는지 이해가 - 그것은 스윙 이벤트 스레드를 될 일 현재 스레드, 모든 도면에 대한 하나의 책임을두고 및 사용자 상호 작용, 잠을. 즉, 전체 응용 프로그램을 완전히 잠자기 상태로 설정합니다.

해결 방법 - 을 이벤트 스레드에서 호출하지 마십시오.

별도로 각 메소드 호출을 자체 행에 넣는 것은 비용이 들지 않으며 혼동하지 않고 목적을 달성 할 수 있도록 게시 한 긴 행에는 아무런 이유가 없습니다.

+0

** ** ** ** ** ** ** ** ** ** ** ** ** 오늘은 해결 된 유일한 문제입니다. – MadProgrammer

+0

@MadProgrammer 우리는 많은 것을 보게됩니다. –

4

try{Thread.sleep(500);revalidate();repaint();}catch(InterruptedException eeee){}은 이벤트 발송 스레드를 차단하여 이벤트 대기열을 처리하지 못하게하고 프로그램이 중단 된 것처럼 보입니다.

내가 사용하는 것이 좋습니다 것

는 또한 자세한 내용은 귀하의 경우에는

에 대한 Performing Custom Painting를 참조 paintComponent를 사용하는 대신 스윙 구성 요소의 paint을 무시하고하는 것은 권장하지 않습니다 .. 자세한 내용은 Concurrency in Swing보기 대신 Thread.sleepjavax.swing.Timer, 업데이트 자세한 내용

에 대한 How to use Swing Timers를 참조

코드에서 drawRoadfalse에서 true으로 변경하는 부분이 보이지 않으므로 paint 메서드는 페인팅 중입니다 ... 아무 것도 ... 그래서 프레임이 여러분이 말한 방식대로 정확하게 그려져있는 것 같습니다. ..

또한 Initial Threads에서 살펴하실 수 있습니다 당신은

업데이트 다른

을 읽을 당신이 Code Conventions for the Java TM Programming Language를 통해 읽기를하는 것 같아서 그 사람들이 코드를 읽기 위해 쉽게하고

는 예 불완전 감안할 내가 DrawPanel drawie = new DrawPanel(null);을 변경하는 경우 ... 나는 그것을 다시 할 때,이 작동,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import org.w3c.dom.Document; 

public class TestDraw extends JFrame { 

    public TestDraw() { 
     super("Roadway Simulator"); 

     setSize(800, 600); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     DrawPanel drawie = new DrawPanel(null); 
     add(drawie); 

     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       new TestDraw(); 

      } 
     }); 
    } 

    class DrawPanel extends JPanel { 

     boolean drawRoad = false; 

     public DrawPanel() { 
      super(); 
     } 

     public DrawPanel(Document doc) { 
      super(); 
      drawRoad = true; 
      revalidate(); 
      repaint(); 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (drawRoad) { 
       g.setColor(Color.BLACK); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
     } 
    } 
} 

를 컴파일되지 않습니다 DrawPanel drawie = new DrawPanel();으로 페인팅하지만 여전히 사용자 정의 페인팅을 수행하지 않습니다.

다른 문제는, 이미 강조 표시 한 바와 같이, 인 피가 null 레이아웃을 사용하여 null 레이아웃

의 사용이다, 완벽한 픽셀 레이아웃은 현대적인 UI 설계 내 환상입니다. 구성 요소의 개별 크기에 영향을주는 요소가 너무 많습니다. 어느 요소도 제어 할 수없는 요소가 너무 많습니다. Swing은 핵심 레이아웃 관리자와 함께 작동하도록 설계되었으므로 레이아웃 관리자가이를 무시하면 문제를 해결하고 더 많은 시간을 수습하여 문제를 해결할 수 있습니다.

은 지금 자세한 내용은 Why is it frowned upon to use a null layout in SWING? 봐 ...

을 가지고 당신이 drawie를 추가 할 때, 당신은 그것을 크기를주지 않을 것을 말했다 데 스윙 0x0 크기의 구성 요소를 페인트하지 똑똑 ...

+0

Thread.sleep (500)을 사용하지 않아도; 내 GUI 여전히 업데이 트되지 않습니다 –

+0

@ JonathanAllenGrant 왜,'drawRoad'는'false'입니다 ... – MadProgrammer

+0

@ JonathanAllenGrant : 실제로, 당신은 상태를 변경하는 생성자를 호출하지 않습니다. 매개 변수를 사용하지 않는 기본 생성자 만 호출합니다. 그리고 그 중 하나는 drawRoad를 변경하지 않습니다. –

관련 문제