2013-09-30 47 views
1

看看我放在这里的评论,任何想法,为什么这不会工作的人?它使用FlowLayout btw,这应该是完全正常工作。我真的可以使用一些帮助,非常感谢!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不工作]的可能重复(http://stackoverflow.com/questions/14857219/setlocation-do-not-work) – Piro

回答

2

没有看到一个SSCCE这是不可能告诉你,但是什么是错的,从你贴什么代码它很可能,你需要熟悉Java的event dispatch thread 因为你的代码相同的线程中的Swing上运行本身如果你的代码试图睡在EDT它会暂停该线程,防止摆动自我更新,并阻止它处理任何其他事件(如鼠标或键盘输入)

Swing也不是线程安全的,所以在从其他线程调用Swing方法时还需要注意。

+0

向下看在我最近发布的内容中:)请感谢 – 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

您应该刚刚编辑了您的原始问题 - 这是答案的区域,因此答案将会无序(并且令人困惑)。话虽如此,你的更新代码也没有多大用处。你错过了一个界面(Header),它没有展示你如何使用它。你需要付出更多努力来创建一个SSCCE(请参阅http://sscce.org/以获得解释) – Goibniu

+1

@Goibniu对不起,我还是新的,直到堆栈溢出。谢谢,我从现在开始一定会这样做。 我明白了现在的SSCCE,并且从现在开始使用它。非常感谢你提供这些信息,我将继续并准备一个SSCCE。 – JeremyF