2013-09-30 3 views
1

내가 여기 넣은 의견을보십시오. 왜 이것이 아무에게도 작동하지 않는다는 아이디어가 있습니까? 그것은 FlowLayout btw를 사용하여, 이것은 완전히 잘 작동해야합니다. 나는 정말로 도움을받을 수 있었다. 정말 고마워! 그것은 당신이 스윙과 동일한 스레드에서 실행하면 코드 때문에 자바의 event dispatch thread 에 익숙해 질 필요가 꽤 가능성 게시 한 내용을 코드에서 그러나, 무엇이 잘못되었는지를 알려하는 것은 불가능 SSCCE을 보지 않고JPanel 타이머가 작동하지 않는 위치

package Primary; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class OpenPanel implements Runnable,Header{ 

private static String panel; 

public OpenPanel(String enterpanel){ 
    panel = enterpanel; 
} 

private Timer nextloc; 
private JPanel usePanel; 
private static ClosePanel cp = new ClosePanel("null"); 

public void run(){ 
    Timer andgo = new Timer(10,new TimerListener()); 
    while(!cp.getCloseDone()){ 
     andgo.start(); 
     andgo.restart(); 
    } 
    if(panel.equals("topiccreator")){ 
     usePanel=topiccreator; 
    }else{ 
     System.out.println("Error moving panel"); 
     usePanel=mainmenu; 
    } 

    // This is the setLocation part that does nothing 
    // All the set locations in the loop with the timer work completely fine 
    usePanel.setLocation(usePanel.getX()+800,usePanel.getY()); 
    usePanel.setVisible(true); 

    nextloc = new Timer(50,new TimerListener()); 
    for(int r=0;r<3500;r+=6){ 
     nextloc.start(); 
     nextloc.restart(); 
    } 
} 

private class TimerListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     if(e.getSource()==nextloc){ 
      usePanel.setLocation(usePanel.getX()-5,usePanel.getY()); 
     } 
    } 
} 

} 
+0

이 코드는 컴파일 가능한 아니므로이 코드는 말도 안돼 .. 그것에 대해 –

+0

을 말해 어렵다. 시작은 패널이 레이아웃 관리자의 통제하에 있으며, 다음에 다시 유효성을 검사 할 때 모든 변경 사항이 무효화되고 레이아웃 관리자가 원하는대로 처리 할 것입니다. 루프에서 루프를 완료 할 때까지 실제로 트리거하도록 변경하지 않는 타이머를 명시하고 다시 시작 (시작)합니다. 간단히 시작하여 종료 조건이 충족 될 때까지 실행하십시오 ... – MadProgrammer

+0

[setLocation do not work] 가능한 복제본 (http://stackoverflow.com/questions/14857219/setlocation-do-not-work) – Piro

답변

2

자체 코드가 EDT에서 잠자기를 시도하면 해당 스레드가 일시 중지되어 스윙이 자동으로 업데이트되지 않으며 마우스 나 키보드 입력과 같은 다른 이벤트를 처리하지 못합니다.

스윙은 스레드로부터 안전하지 않으므로 다른 스레드에서도 Swing 메서드를 호출 할 때는주의해야합니다.

+0

Look down 내가 최근 게시 한 내용 : 감사합니다. – JeremyF

0

Timer와 TimerTask로 ClosePanel 클래스를 완전히 다시 만들었습니다. 슬프게도, 어떤 이상한 이유로 패널의 위치를 ​​설정할 수 없습니다. 위치를 설정하고 위치를 인쇄하면 설정 한 위치가 표시되지만 패널은 종료되지 않은 것처럼 완전히 보이지 않습니다. 그것은 거기 ...

package Primary; 

import java.awt.Color; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JPanel; 

public class ClosePanel implements Runnable,Header{ 

private JPanel usePanel; 
private int counter=0; 

public ClosePanel(String panel){ 
    if(panel.equals("mainmenu")){ 
     usePanel=mainmenu; 
    }else if(panel.equals("topiccreator")){ 
     usePanel=topiccreator; 
    }else{ 
     usePanel=mainmenu; 
     System.out.println("Null panel, using mainmenu instead"); 
    } 
} 

public void run(){ 
    Timer nextmove = new Timer(); 
    nextmove.schedule(new TimerTask(){ 
     public void run(){ 
      usePanel.setLocation(usePanel.getX()-5,usePanel.getY()); 
      counter+=5; 
      if(counter>=1275){ 
       cancel(); 
       } 
      } 
     },0,2); 
    Thread openpanel = new Thread(new OpenPanel("mainmenu")); 
    openpanel.start(); 
} 

} 
+1

당신은 원래 질문을 편집했을 것입니다. 이것은 응답을위한 영역입니다. 따라서 응답은 순서가 맞지 않고 혼란 스러울 것입니다. 귀하의 업데이트 된 코드는별로 사용하지 않는다고 말한 것입니다. 인터페이스 (헤더)가 누락되었습니다. 어떻게 사용하고 있는지 보여주는 것은 아닙니다. SSCCE를 만드는 데 더 많은 노력을 기울일 필요가 있습니다. (설명은 http://sscce.org/를 참조하십시오.) – Goibniu

+1

@Goibniu 스택 오버 플로우가 발생하기 전까지 미안합니다. 고맙습니다. 앞으로도 그렇게 할 것입니다. SSCCE가 지금 무엇인지 확인하고 지금부터 사용하기 시작할 것입니다. 이 정보에 감사 드리며 SSCCE를 준비하겠습니다. – JeremyF

관련 문제