2017-11-30 2 views
0

Ich habe kürzlich mit Java rumspielen und ich versuche, ein kleines Spiel zu entwickeln. Das Problem ist, dass der JViewport, den ich verwende, nicht aktualisiert wird. Wenn Sie die Repaint-Methode im Viewport aufrufen, flackert das Viewport an der richtigen Position und das gesamte Bild, das von Viewport angezeigt wird, wird im Hintergrund gezeichnet und funktioniert einwandfrei. Wie male ich nur den Viewport, nicht den ganzen Rest? Thx für Antworten;Wie update ich JViewPort

public start() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Dimension my = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
     Rectangle myrec = new Rectangle(0,0,my.width, my.height); 
     setBounds(myrec); 
     this.setUndecorated(true); 

     JPanel Background = new JPanel(); 
     Background.setBounds(myrec); 
     Background.setLayout(null); 
     setContentPane(Background); 

     JScrollPane map = new JScrollPane(); 
     map.setBounds(0, 0, 3000, 3000); 
     map.setLayout(null); 

     //setContentPane(map); 

     gameoberflaeche MainMap = new gameoberflaeche(); 
     MainMap.setBounds(0,0, map.getWidth(), map.getHeight()); 
     MainMap.setup(); 
     map.add(MainMap); 

     Viewport currview = new Viewport(myrec, MainMap.player_1, map); 
     Background.add(currview); 
     //setContentPane(currview); 

     int delay = (1000/30); 
     ActionListener update = new ActionListener(){ 
      public void actionPerformed(ActionEvent evt) { 
       MainMap.Anfang.checkdead(); 
       //currview.stats.update(); 
       //currview.weaponpanel.update(); 
       //currview.MagPanel.update(); 
       currview.update(MainMap.player_1.field.x, MainMap.player_1.field.y); 

      } 
     }; 
     new Timer(delay, update).start(); 

    } 


     public class Viewport extends JViewport{ 
    Player myplayer; 
    statpanel stats; 
    Magazin MagPanel; 
    Waffenpanel weaponpanel; 
    Rectangle myrec; 

    public Viewport(Rectangle myrec, Player myp, JScrollPane myview) { 
     setView(myview); 
     reshape(0,0,myrec.width,myrec.height); 
    } 

    public void update(int x, int y) { 

    // System.out.println(getView()); 
     setViewPosition(new Point(x,y)); 
     System.out.println(x + " " + y + " " + getViewRect()); 
    } 

} 
+0

Sie verpassen den 'JScrollPane' verwenden und wahrscheinlich auch die' JViewport'. – MadProgrammer

Antwort

1
JPanel Background = new JPanel(); 

Variablennamen sollten nicht mit einem Großbuchstaben beginnen.

Background.setLayout(null); 

Verwenden Sie kein Null-Layout. Swing wurde für die Verwendung mit Layout-Managern entwickelt.

JScrollPane map = new JScrollPane(); 
map.setLayout(null); 

Verwenden Sie niemals ein Null-Layout auf einem JScrollPane. Ein JScrollPane verwendet einen internen Layout-Manager die horizontalen/vertikalen Bildlaufleisten manange, die Zeilen-/Spaltenüberschriften und das Ansichtsfenster usw.

Viewport currview = new Viewport(myrec, MainMap.player_1, map); 

Sie kein neues Ansichtsfenster erstellen. Um die Komponente in der scrollpane zu aktualisieren alles, was Sie tun, ist die Komponente in das Ansichtsfenster des scrollpane hinzu:

scrollPane.getViewport().setView(...); 
+0

Ändert, was Sie erwähnt haben, aber das Ansichtsfenster bewegt sich nicht. Weder mit scrollRectToVisible noch mit setViewPosition. Wenn ich ViewRect debugge und betrachte, wird es auf die neue Position aktualisiert. Danke für Ihre Hilfe! – Ragnaroek511

+0

Sie hatten so viele Fehler. Ich kann unmöglich sagen, ob Sie alle Probleme behoben haben. Veröffentlichen Sie Ihr [mcve], das das Problem veranschaulicht. Der Punkt eines MCVE ist wiederum, den Kontext der Frage zu demonstrieren, nicht Ihr tatsächliches Programm. Du fragst also warum das Viewport nicht mehr ist. Erstellen Sie ein einfaches Beispiel mit einem Rahmen und einer Swing-Komponente in einem Bildlauffenster. Vielleicht fügen Sie eine JTextArea hinzu. Dann fügen Sie eine JButton hinzu. Wenn Sie auf die Schaltfläche klicken, scrollen Sie im Ansichtsfenster. Sobald Sie das grundlegende Konzept verstehen, wenden Sie das Wissen auf Ihr wirkliches Programm an. – camickr

Verwandte Themen