2017-04-30 44 views
0

如何制作滚动的JFrame?像这个代码不滚动。所以在一段时间后按钮消失了。所以我怎么能做到这一点?谁能帮我?在Java中为游戏滚动JFrame

import javax.swing.JFrame; 
import javax.swing.*; 

class c extends JFrame implements Runnable{ 

    JButton b1; 
    c(){   
     b1=new JButton("Going Up"); 
     b1.setBounds(150,600,100,50); 
     this.add(b1); 

     this.setSize(400,800); 
     this.setLayout(null); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void run(){ 
     try{ 
      while(true) 
      { 
       b1.setLocation(b1.getX(),b1.getY()-2); 
       Thread.sleep(20); 
      } 


      } 
     catch(Exception ex){ 
     } 
    } 

    public static void main(String[] args){ 
     c a1 = new c(); 
     Thread t1 = new Thread(a1);  
     t1.start(); 
    } 
} 
+0

'所以一段时间后按钮消失' - y值变为负值。只需添加一条if语句并将该值重置为0。 – camickr

回答

1

如果您想滚动发生,您需要使用JScrollPane。

当您使用滚动窗格时,当添加到滚动窗格的面板的首选大小大于滚动窗格的大小时,滚动条会自动发生。

因此,这意味着每次尝试将按钮位置设置为负值时,都需要将按钮位置重置为0,并增加面板的首选大小。

您可以使用Drag Layout,因为当组件在面板中移动时,它会自动重新计算面板的首选尺寸。

所以基本逻辑是这样的:然后,在你需要使用线程

JButton button = new JButton("..."); 
button.setLocation(150, 600); 

JPanel panel = new JPanel(new DragLayout()); 
panel.add(button); 

this.add(new JScrollPane(panel)); 

b1.setLocation(b1.getX(),b1.getY()-2); 
panel.revalidate(); 

的重新验证()是需要调用的布局管理器。

编辑:

这种方法只有在有固定面板中的其它组件协同工作。使用单个组件时,它始终在框架顶部可见,但滚动条永远不会出现,因为首选大小基本上只是单个按钮的大小。