2017-04-30 8 views
0

Wie kann ich einen scrollenden JFrame machen? wie dieser Code scrollt nicht nach oben. Nach einiger Zeit ist der Knopf verschwunden. Also, wie kann ich das machen? Kann mir jemand helfen?Scrollen JFrame für Spiel in Java

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

'So nach einiger Zeit Knopf ist verschwunden' - der y-Wert wird negativ. Fügen Sie einfach eine if-Anweisung hinzu und setzen Sie den Wert auf 0 zurück. – camickr

Antwort

1

Wenn Sie scrollen möchten, müssen Sie eine JScrollPane verwenden.

Wenn Sie einen Bildlaufbereich verwenden, werden die Bildlaufleisten automatisch angezeigt, wenn die bevorzugte Größe des zum Bildlaufbereich hinzugefügten Bereichs größer als die Größe des Bildlaufbereichs ist.

Dies bedeutet, dass jedes Mal, wenn Sie versuchen, die Position der Schaltfläche einen negativen Wert zu machen, müssen Sie die Schaltfläche Position auf 0 zurücksetzen, und erhöhen Sie die bevorzugte Größe des Panels.

Sie können die Drag Layout verwenden, da sie automatisch die bevorzugte Größe eines Panels neu berechnet, wenn eine Komponente im Panel bewegt wird.

So ist die grundlegende Logik wäre so etwas wie:

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

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

this.add(new JScrollPane(panel)); 

dann im Thread Sie verwenden müssen:

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

Die revalidate() ist notwendig, um die Layout-Manager aufzurufen.

Edit:

Dieser Ansatz funktioniert nur, wenn es andere Komponenten in der Platte befestigt sind. Mit einer einzigen Komponente wird es immer oben im Rahmen sichtbar sein, aber Bildlaufleisten werden nie erscheinen, da die bevorzugte Größe im Grunde nur die Größe der einzelnen Taste ist.