2016-01-17 1 views
1

J'ai un problème avec le déplacement JPanels.JAVA JPanel glisser et glisser en même temps

J'ai une fenêtre 400x600 et un JPanel (couleur rouge) 100x100

public class RulettModel { 
    private int num; 

    public void Slide() { 
     num = num + 1; 
     if(num > 600) { 
      num = -100; 
     } 
    } 

    public int getNum() { 
     return num; 
    } 
} 

class RulettListener implements ActionListener{ 
    Timer tm = new Timer(1, this); 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     tm.start(); 
     int y = 0; 

     theModel.Slide(); 

     theView.setNewLocationOfPiros(theModel.getNum(), y);   
    } 
} 

void setNewLocationOfJpanel(int x, int y) { 
    JPanel1.setLocation(x,y); 
} 

Ce code fait partie de mon code qui est nécessaire ici, cela fonctionne bien mon JPanel glisse hors de la fenêtre sur le côté droit et quand il hors de wi ndow width son départ revenant de -100 donc du côté gauche

Le problème que j'ai: Je veux que mon JPanel vienne du côté gauche avant qu'il ne soit complètement sorti sur le côté droit.

Donc, si la moitié du panneau s'éteignait déjà, cette moitié devrait déjà apparaître à gauche, donc mon panneau devrait être à 2 endroits à la fois, la moitié ici et la moitié est-ce possible d'une façon ou d'une autre?

Tout autres conseils appréciés pour résoudre ce problème.

Répondre

0

Avant le codage ci-dessous, j'ai utilisé Microsoft Paint pour faire 7 rectangles de couleurs différentes, 60 pixels de large et 90 pixels de haut. Où vous voyez jf.setSize(186,120) J'ai seulement obtenu ces valeurs par essais et erreurs. Mon timerDelay je devinais juste serait une valeur appropriée. Toutes les autres valeurs devraient être évidentes pour savoir pourquoi. La clé de tout cela est que dans le TimerActionListener, j'ai simplement getLocation() de chaque tile [i], ajoute 5 à la coordonnée x, et la réinitialise à -120 quand elle atteint 300, puis setLocation (int, int) à nouveau.

package SlidingTiles; 

import ...; 

public class Main 
{ 
    private static int timerDelay = 100; 
    private static Timer t = new Timer(timerDelay, new TimerActionListener()); 

    private static JFrame jf = new JFrame(); 
    private static JPanel jp = new JPanel(); 
    private static String[] colors = { "blue", "brown", "green", "grey", "purple", "red", "yellow" }; 
    private static JLabel[] tiles = new JLabel[7]; 

    public static void main(String[] args) 
    { 


     for(int i=0; i<7; ++i) 
     { 
      tiles[i] = new JLabel(new ImageIcon("tiles/"+colors[i]+".jpg")); 
      tiles[i].setBounds(-120+60*i,0,60,90); 
      jf.add(tiles[i]); 
     } 

     jf.add(jp); 
     jf.setSize(186,120); 
     jf.setResizable(false); 
     jf.setVisible(true); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     t.start(); 
    } 

    public static class TimerActionListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      for(int i=0; i<7; ++i) 
      { 
       Point p = tiles[i].getLocation(); 
       int newX = (int) p.getX()+5; 
       if(newX == 300) 
        newX = -120; 

       tiles[i].setLocation(newX, 0); 
      } 
     } 
    } 
} 
0

Je suppose que vous avez besoin de 2 JPanels. Ensuite, j'aurais

public class RulettModel { 
    private int num1, num2; 

    public void Slide() { 
     num1 = num1 + 1; 
     if(num1 > 600) { 
      num2 = 500-num1; 
     } 
    } 

    public int getNum1() { 
     return num1; 
    } 

    public int getNum2() { 
     return num2; 
    } 
} 

et ont setNewLocOfJPanel1(int, int) et setNewLocOfJPanel2(int, int) méthodes

+0

bonne idée, mais le problème avec cela à l'avenir je veux toute la ligne avec plein de JPanels rouge et noir si tous les JPanel devraient avoir un double qui serait un gâchis isnt qui? – aXieEEE

+0

hmm, cela le complique un peu, mais probablement pas beaucoup. Avoir une classe qui étend JLabel avec une méthode int: setNewLoc (boolean wrapToLeft) et un JLabel [] de cette classe. Sur le TimerEvent (ou quel que soit son nom), chaque sous-classe JLabel du tableau peut calculer sa propre nouvelle position et la renvoyer. La méthode appelante peut vérifier si la nouvelle position est> 600, et si c'est le cas, indiquer le JLabel suivant dans le tableau à ce sujet afin qu'il puisse commencer à se déplacer vers la gauche. À un certain point, vous aurez besoin de modulo arraySize arithmetic, mais vous pourriez le faire fonctionner de cette façon. – plainOldNerd

+0

Je l'ai essayé dans votre façon de travailler mais les panneaux dupliqués où devrais-je me cacher? Je les ai rendus faux d'abord, mais puis-je les enlever complètement de la fenêtre? http://imgur.com/a/9vBp9 meilleure solution devrait être de définir leur emplacement de la fenêtre à la position où ils devraient être, puis-je les mettre hors de la fenêtre en quelque sorte dans l'éditeur? – aXieEEE