如何在java swing中向左,向右,向上,向下移动形状

问题描述:

我正在尝试使用按钮移动形状,但是我没有理解它。这是我画类如何在java swing中向左,向右,向上,向下移动形状

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按钮,我想通过点击按钮来移动形状。我尝试了一些方法,但没有一个为我工作。任何建议我如何做到这一点。我应该创建任何新的行动事件或类。

+0

首先,了解绘画在Swing中的工作原理,参见[绘画AWT和Swing](http://www.oracle.com/technetwork/java/painting-140037.html)和[执行自定义绘画](http://docs.oracle.com/javase/tutorial/uiswing/painting/ )。 – MadProgrammer 2014-11-22 08:48:33

+0

我正在阅读并仍在寻找解决方案 – 2014-11-22 09:10:03

+0

*“我尝试了一些方法..”*向我们展示您在[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)中尝试​​的内容。 – 2014-11-22 09:10:10

我为你写了一个快速代码,只是为了从 得到想法你可以使用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); 
    } 

} 
+0

如果'a'和'b'没有画出框架的'paint'方法绘制的东西,你会很幸运...... – MadProgrammer 2014-11-22 09:19:38

+0

*“例如comp。 setLocation(comp.getX(),comp.getY());“* - 不是在涉及布局管理器的时候,当容器被重新验证时,组件的位置和大小将被重置为布局管理器想要的使用,我不会建议使用'null'布局,因为不适合真正需要做的事情只会吸引高级Swing海报的愤怒。 – MadProgrammer 2014-11-22 09:40:29

首先...

了解在Swing绘画作品如何,看Painting in AWT and SwingPerforming Custom Painting

建议您覆盖的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); 
    } 

} 

其次...

有许多方法你可能做到这一点,我个人'd只是利用[Graphics2DShape的API](2D Graphics),但有些事告诉我对你来说不够好,所以...

而不是试图用基于组件的形状(和要争取布局管理器),创建它描述了“绘制”元素的接口,这东西可画...

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一个S和使用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(); 
    } 

} 

现在你有一些画和someth可以画出他们...

第三...

做些事情来绘制。我会用一个抽象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)); 

     } 

    } 

} 

好了,所以这个油漆2个绘图资源,但如何将他们?

基本上,你抢你要移动,有点像Drawable参考...

Drawable drawable = canvas.getDrawableAt(0); 

然后修改它的位置...

drawable.getBounds().x += 5; 
drawable.getBounds().y += 5; 

然后你重绘MyCanvas实例...

canvas.repaint();