Вы создаете новую DrawingComponent
и добавить его к раме на каждом цикле клеща. Это очень много. DrawComponent
s
Хотя анимацию компонента можно перемещать, переместив ее, вам нужно будет предоставить дополнительную информацию о том, почему вы хотите сделать это таким образом. Предпочтительным способом было бы использовать что-то вроде JPanel
, добавить его в кадр, используя BorderLayout
и переопределить панели paintComponent
.
Проблема с попыткой «переместить» компонент заключается в том, что компоненты имеют определенное пространство, в котором они могут визуализироваться, из внешнего вида вашего кода вы, вероятно, будете иметь размер 0x0, что не так много места для краска в вообще ...
Обновлены например
Итак, следующий пример демонстрирует картину прямоугольника в пределах компонента, используя менеджер компоновки, который будет пытаться размер компонента к доступное полезное пространство.
Он также показывает пользователю getPreferredSize
, чтобы предоставить подсказки полезного размера обратно менеджеру макета.
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();
}
}
}
Вы создаете новый 'DrawingComponent' и добавить его к раме на каждом цикле клеща. Это много «DrawComponent's – MadProgrammer
» См. [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) окончательный пример –