如何在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按钮,我想通过点击按钮来移动形状。我尝试了一些方法,但没有一个为我工作。任何建议我如何做到这一点。我应该创建任何新的行动事件或类。
我为你写了一个快速代码,只是为了从 得到想法你可以使用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);
}
}
如果'a'和'b'没有画出框架的'paint'方法绘制的东西,你会很幸运...... – MadProgrammer 2014-11-22 09:19:38
*“例如comp。 setLocation(comp.getX(),comp.getY());“* - 不是在涉及布局管理器的时候,当容器被重新验证时,组件的位置和大小将被重置为布局管理器想要的使用,我不会建议使用'null'布局,因为不适合真正需要做的事情只会吸引高级Swing海报的愤怒。 – MadProgrammer 2014-11-22 09:40:29
首先...
了解在Swing绘画作品如何,看Painting in AWT and Swing和Performing 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只是利用[Graphics2D
和Shape
的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);
}
这描述的东西,可以绘制,地点和什么颜色
接下来,保持Drawables
的List
一个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();
首先,了解绘画在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
我正在阅读并仍在寻找解决方案 – 2014-11-22 09:10:03
*“我尝试了一些方法..”*向我们展示您在[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)中尝试的内容。 – 2014-11-22 09:10:10