2013-03-05 3 views
0

Я пытаюсь сделать программу для перемещения прямоугольников по JFrame, может кто-нибудь объяснить, почему это не работает?Перемещение прямоугольника вниз по JFrame

public class DrawingComponent extends JLabel { 

public static int x = 0; 

public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 
    Rectangle rect = new Rectangle(50,x,50,50); 
    g2.draw(rect); 
    x = x+100; 
} 
} 

public class GameL { 

javax.swing.JFrame frame = new javax.swing.JFrame(); 

public static void main(String[] args) { 
     GameL tetris = new GameL(); 
     tetris.start();  
} 

public void start(){ 
    //setup frame 
    frame.setSize(800,600); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    TimerEH timereh = new TimerEH(); 
    Timer timer = new Timer(5000,timereh); 
    timer.start();   
} 

class TimerEH implements ActionListener{   
    public void actionPerformed(ActionEvent e){ 
     DrawingComponent dc = new DrawingComponent(); 
     frame.add(dc); 
    }  
} 
} 
+0

Вы создаете новый 'DrawingComponent' и добавить его к раме на каждом цикле клеща. Это много «DrawComponent's – MadProgrammer

+0

» См. [This] (http://stackoverflow.com/questions/13825515/java-rectangle-collision-detection-confusion/13827649#13827649) аналогичный ответ и его [вариант] (http: //stackoverflow.com/questions/13999506/threads-with-key-bindings/14001011#14001011). И [это] (http://www.daniweb.com/software-development/java/code/444547/game-development-loop-logic-and-collision-detection-java-swing-2d) окончательный пример –

ответ

4

Вы создаете новую DrawingComponent и добавить его к раме на каждом цикле клеща. Это очень много. DrawComponent s

Хотя анимацию компонента можно перемещать, переместив ее, вам нужно будет предоставить дополнительную информацию о том, почему вы хотите сделать это таким образом. Предпочтительным способом было бы использовать что-то вроде JPanel, добавить его в кадр, используя BorderLayout и переопределить панели paintComponent.

Проблема с попыткой «переместить» компонент заключается в том, что компоненты имеют определенное пространство, в котором они могут визуализироваться, из внешнего вида вашего кода вы, вероятно, будете иметь размер 0x0, что не так много места для краска в вообще ...

Обновлены например

Итак, следующий пример демонстрирует картину прямоугольника в пределах компонента, используя менеджер компоновки, который будет пытаться размер компонента к доступное полезное пространство.

Он также показывает пользователю getPreferredSize, чтобы предоставить подсказки полезного размера обратно менеджеру макета.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class CreppyRectangle { 

    public static void main(String[] args) { 
     new CreppyRectangle(); 
    } 

    public CreppyRectangle() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridLayout(0, 6)); 
       frame.add(new TestPane(Color.RED)); 
       frame.add(new TestPane(Color.GREEN)); 
       frame.add(new TestPane(Color.BLUE)); 
       frame.add(new TestPane(Color.ORANGE)); 
       frame.add(new TestPane(Color.PINK)); 
       frame.add(new TestPane(Color.MAGENTA)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private int yPos; 
     private int size = 25 + (int)Math.round(Math.random() * 50); 
     private int yDelta = 5 + (int)Math.round(Math.random() * 10); 

     public TestPane(Color foreground) { 
      setForeground(foreground); 
      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        yPos += yDelta; 
        if (yPos < 0) { 
         yPos = 0; 
         yDelta *= -1; 
         System.out.println(yDelta); 
        } else if (yPos + size > getHeight()) { 
         yPos = getHeight() - size; 
         yDelta *= -1; 
        } 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(50, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(getForeground()); 
      g2d.drawRect(0, yPos, getWidth() - 1, size); 
      g2d.dispose(); 
     } 
    } 

} 
+0

Thank You так много для вашего подробного ответа! Это сообщество удивительно, и я не могу дождаться дня, когда я смогу внести ответы вместо вопросов. Спасибо! –

+0

Теперь, это правильное отношение! – MadProgrammer

+0

+1 выглядит так красиво :) –

Смежные вопросы