[英]How I can move the shape left,right,up,down in java swing
我正在尝试通过button来移动形状,但是我没有得到。 这是我的绘画课
class MyCanvas extends JComponent {
public void paint(Graphics g) {
g.setColor(Color.RED);
g.fill3DRect(20, 20, 200, 200,true);
}
}
class MyCanvas1 extends JComponent {
public void paint(Graphics g) {
g.setColor(Color.RED);
g.drawRect(20, 20, 200, 200);
}
}
我通过以下代码成功完成了绘图->
public class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e) {
if(check)
{
if(e.getSource()==btnNewButton)
{
MyCanvas can=new MyCanvas();
me s=new me();
can.setSize(400, 500);
panel_3.add(can);
panel_3.repaint();
addComponent(can);
s.can;
choice=true;
}
}
else
{
if(e.getSource()==btnNewButton)
{
panel_3.removeAll();
MyCanvas1 can=new MyCanvas1();
can.setSize(500, 500);
panel_3.add(can);
panel_3.repaint();
addComponent(can);
}
}
它对我来说很好。 现在,我还有另一个4按钮,我想通过单击按钮来移动形状。 我尝试几种方法,但没有一种对我有用。 关于如何做到的任何建议。我应该创建任何新的动作事件或类。
了解绘画在Swing中的工作方式,请参阅AWT中的绘画以及Swing和执行自定义绘画 。
建议您覆盖paintComponent
而不是paint
并始终确保调用super.paintComponent
public class MyCanvas extends JComponent {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fill3DRect(20, 20, 200, 200,true);
}
}
就个人而言,您可以通过多种方式实现此目的,我只是利用Graphics2D
和Shape
的API ,但是有些信息告诉我,这对您来说还不够好,所以...
与其尝试使用基于组件的形状(而不必与布局管理器打交道),而是创建一个描述“可绘制”元素的界面,该界面可以绘制...
public interface Drawable {
public Rectangle getBounds();
public void setBounds(Rectangle bounds);
public Color getColor();
public void setColor(Color color);
public void draw(Graphics2D g2d);
}
这描述了可以绘制的内容,位置和颜色
接下来,维护Drawables
的List
并使用paintComponent
方法绘制它们。
public class MyCanvas extends JComponent {
private List<Drawable> drawables;
public MyCanvas() {
drawables = new ArrayList<>(25);
}
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
public void add(Drawable drawable) {
drawables.add(drawable);
repaint();
}
public void remove(Drawable drawable) {
drawables.remove(drawable);
repaint();
}
public int getDrawableCount() {
return drawables.size();
}
public Drawable getDrawableAt(int index) {
return drawables.get(index);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
for (Drawable d : drawables) {
d.draw(g2d);
}
g2d.dispose();
}
}
现在您有了可以绘画的东西,可以绘画的东西...
画些东西。 我将从抽象的Drawable
开始,其中涵盖了所有常见的内容,以使生活更轻松...
public abstract class AbstractDrawable {
private Rectangle bounds;
private Color color
public AbstractDrawable(Rectangle bounds, Color color) {
setBounds(bounds);
setColor(color);
}
public Rectangle getBounds() {
return bounds;
}
public void setBounds(Dimension bounds) {
this.bounds = bounds;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public abstract void draw(Graphics2D g2d);
}
你可以疯了...
public class DrawableRectangle {
public AbstractDrawable(Rectangle bounds, Color color) {
super(bounds, color);
}
public abstract void draw(Graphics2D g2d) {
g2d.setColor(getColor());
g2d.fill(getBounds());
}
}
和/或...
public class Drawable3DRectangle {
public AbstractDrawable(Rectangle bounds, Color color) {
super(bounds, color);
}
public abstract void draw(Graphics2D g2d) {
g2d.setColor(getColor());
Rectangle bounds = getBounds();
g2d.fill3DRect(bounds.x, bounds.y, bounds.width, bounds.height);
}
}
全部放在一起...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DrawableShapes {
public static void main(String[] args) {
new DrawableShapes();
}
public DrawableShapes() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private MyCanvas canvas;
public TestPane() {
setLayout(new BorderLayout());
canvas = new MyCanvas();
add(canvas);
canvas.add(new Drawable3DRectangle(new Rectangle(20, 20, 100, 100), Color.RED));
canvas.add(new DrawableRectangle(new Rectangle(20, 140, 100, 100), Color.RED));
}
}
}
好吧,所以这画了两个画,但是如何移动它们呢?
基本上,您可以获取要移动的Drawable
的引用,例如...
Drawable drawable = canvas.getDrawableAt(0);
然后您修改它的位置...
drawable.getBounds().x += 5;
drawable.getBounds().y += 5;
然后您重新绘制MyCanvas
实例...
canvas.repaint();
我为您编写了一个快速代码,只是为了从中获得灵感。您可以使用Component setLocation(int x,int y); 为了获得当前的x和y位置,可以使用JComponent的getX()和getY()方法。
例如comp.setLocation(comp.getX(),comp.getY());
public class Move extends JFrame implements ActionListener {
JComponent b = new JButton("Move me");
JButton a = new JButton("Move that");
Random rd = new Random();
public Move() throws HeadlessException {
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(a);
add(b);
a.addActionListener(this);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] args) {
new Move();
}
@Override
public void paint(Graphics g) {
super.paint(g);
int r = rd.nextInt(400);
b.setLocation(b.getX(), r);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.