繁体   English   中英

我如何在Java Swing中向左,向右,向上,向下移动形状

[英]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);
    }

}

第二...

就个人而言,您可以通过多种方式实现此目的,我只是利用Graphics2DShape的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);
}

这描述了可以绘制的内容,位置和颜色

接下来,维护DrawablesList并使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM