2016-01-17 3 views
1

У меня проблема с перемещением JPanels.JAVA JPanel выдвигается и сдвигается в то же время

У меня есть окно 400х600 и JPanel (красным цветом) 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); 
} 

Этот код является частью моего кода, который необходимо здесь это прекрасно работает, мой JPanel скользит из окна в правую сторону и когда он выходит из wi ndow width его начало возвращается с -100, так что с левой стороны

У меня есть проблема: Я хочу, чтобы мой JPanel вышел с левой стороны, прежде чем он вышел наружу с правой стороны.

Итак, если половина панели уже вышла, то эта половина должна появиться слева, поэтому моя панель должна быть в 2-х местах за раз, половина здесь и половина есть что-то возможно?

Любые другие советы, оцененные для решения этой вещи.

ответ

0

Перед кодированием ниже, я использовал Microsoft Paint, чтобы сделать 7 прямоугольников разных цветов, 60 пикселей в ширину и 90 пикселей в высоту. Где вы видите jf.setSize(186,120) Я получил эти значения только путем проб и ошибок. Мой timerDelay, я просто догадался, будет подходящей ценностью. Все остальные значения должны быть очевидны относительно того, почему.

Ключом всего этого является то, что в TimerActionListener я просто получаю локацию() для каждой плитки [i], добавляю 5 к координате x и сбрасываю ее до -120, когда она достигает 300, а затем setLocation (int, int).

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

Наверное, вам нужны 2 JPanels. Тогда я бы

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; 
    } 
} 

и имеют setNewLocOfJPanel1(int, int) и setNewLocOfJPanel2(int, int) методы

+0

Хорошая идея, но проблема с, что в будущем я хочу всю линию с полным JPanels красный и черный так каждый JPanel должен иметь дубликат, который был бы бардак разве что? – aXieEEE

+0

Хм, это немного усложняет, но, вероятно, не так много. Имейте класс, который расширяет JLabel с помощью метода int: setNewLoc (boolean wrapToLeft) и JLabel [] этого класса. В TimerEvent (или как бы там ни называлось) каждый подкласс класса JLabel в массиве может вычислить его собственную новую позицию и вернуть его. Вызывающий метод может проверить, есть ли новая позиция> 600, и если да, скажите следующей JLabel в массиве об этом, чтобы он мог начать обертывать влево. В какой-то момент вам понадобится арифметика modulo arraySize, но вы можете заставить ее работать именно так. – plainOldNerd

+0

Я попробовал это по-твоему, но это дублированные панели, где я должен спрятаться? я сначала сделал их видимыми, но могу ли я полностью удалить их из окна? http://imgur.com/a/9vBp9 Лучшее решение должно заключаться в том, чтобы установить свое местоположение ouf окна в том месте, где они должны быть, могу ли я установить их из окна как-нибудь в редакторе? – aXieEEE