如何在 Java 中创建可拖动对象?

Posted

技术标签:

【中文标题】如何在 Java 中创建可拖动对象?【英文标题】:How do I create a draggable object in Java? 【发布时间】:2016-09-17 01:33:18 【问题描述】:

我正在尝试为会计学生创建一款游戏,让他们能够更多地了解资产、负债和所有者权益。我已经为该程序创建了图形,但遗憾的是无法弄清楚如何将词汇编码为可拖动到每个帐户列的可移动对象。我希望能够将单词拖到每个部分,然后使用复选标记按钮检查答案以查看帐户是否全部正确。在我尝试并尝试创建此程序时,我将不胜感激。我的按钮设置为默认位置并且无法更改它们的位置时也遇到了问题。我将不胜感激任何帮助,并将代码留在下面,以便更容易理解问题。

import java.awt.*;
import java.applet.*;
import javax.swing.*;


public class FinalProjectst extends Applet

private int xCoord, yCoord;
private boolean mouseDown;

public void init() 
  setSize(1000,650);
  repaint();

  //Check Button\\
  Button b = new Button();
  b.setBackground(Color.green);
  b.setBounds(475,525,50,50);
  b.setSize(50,50);
  b.setFont(new Font("TimesRoman",Font.BOLD,40));
  b.setLabel("\u2713");
  add(b);

  //Reset Button\\
  Button c = new Button();
  c.setBackground(Color.red);
  c.setBounds(475,600,50,50);
  c.setSize(50,50);
  c.setFont(new Font("TimesRoman",Font.BOLD,40));
  c.setLabel("X");
  add(c);


public void paint(Graphics g)

  //Assets Box\\
  g.setColor(Color.green);
  g.fillRect(0,0,333,500);
  g.setColor(Color.white);
  g.setFont(new Font("TimesRoman",Font.PLAIN,54));
  g.drawString("Assets",90,60);

  //Liabilities Box\\
  g.setColor(Color.red);
  g.fillRect(333,0,667,500);
  g.setColor(Color.white);
  g.setFont(new Font("TimesRoman",Font.PLAIN,54));
  g.drawString("Liabilities",380,60);

  //Owner's Equity Box\\
  g.setColor(Color.blue);
  g.fillRect(668,0,338,500);
  g.setColor(Color.white);
  g.setFont(new Font("TimesRoman",Font.PLAIN,54));
  g.drawString("Owner's Equity",670,60);      

  //Word Bank Box\\
  g.setColor(Color.black);
  g.fillRect(0,500,1005,175);

  //T-Chart Boundaries\\
  g.setColor(Color.black);
  g.drawLine(0,75,1005,75);
  g.drawLine(333,0,333,500);
  g.drawLine(667,0,667,500);
  g.drawLine(1005,0,1005,674);
  g.drawLine(0,650,1005,650);
  g.drawLine(0,500,1005,600);

  //Rent Expense Box\\
  g.setColor(Color.white);
  g.fillRect(25,525,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Rent Expense",30,555);

  //Retained Earnings\\
  g.setColor(Color.white);
  g.fillRect(25,600,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Retained",50,620);
  g.drawString("Earnings",50,645);

  //Common Stock\\
  g.setColor(Color.white);
  g.fillRect(175,525,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Common",195,545);
  g.drawString("Stock",210,570);

  //Accounts Receivable\\
  g.setColor(Color.white);
  g.fillRect(175,600,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Accounts",195,620);
  g.drawString("Receivable",190,645);

  //Dividends\\
  g.setColor(Color.white);
  g.fillRect(325,525,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Dividends",343,558);

  //Drawing\\
  g.setColor(Color.white);
  g.fillRect(325,600,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Drawing",350,633);

  //Cash\\
  g.setColor(Color.white);
  g.fillRect(550,525,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Cash",590,558);

  //Miscellaneous Expense\\
  g.setColor(Color.white);
  g.fillRect(550,600,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Miscellaneous",550,620);
  g.drawString("Expense",575,642);

  //Tax Payable\\
  g.setColor(Color.white);
  g.fillRect(700,525,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Tax",740,545);
  g.drawString("Payable",725,565);                       

  //Equipment\\
  g.setColor(Color.white);
  g.fillRect(700,600,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Equipment",715,632);

  //Prepaid Insurance\\
  g.setColor(Color.white);
  g.fillRect(850,525,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Prepaid",877,545);
  g.drawString("Insurance",870,565);

  //Accounts Payable\\
  g.setColor(Color.white);
  g.fillRect(850,600,125,50);
  g.setColor(Color.black);
  g.setFont(new Font("TimesRoman",Font.PLAIN,22));
  g.drawString("Accounts",870,620);
  g.drawString("Payable",878,642);

 

 public boolean mouseDown(Event e, int x, int y)
 
    xCoord = x;
    yCoord = y;
  if((xCoord >= 475 && xCoord <= 525)&&(yCoord >=600 && yCoord <= 650)) 
     mouseDown = true;
  
    //repaint();
  mouseDown = false;
    return true;
 



 

【问题讨论】:

【参考方案1】:

编辑:请参阅此答案下方的评论。我推荐这个答案中的方法:https://***.com/a/11814384/1270000

原答案: 以下是一些可能有帮助的逻辑:

1) 将您的按钮变成对象,以便每个按钮都可以即时更新,并且只在您的绘制方法中放置对这些对象的引用。在下面的代码中,我称之为myGraphicObject

2) 因为您的按钮现在是对象,您可以向它们添加一些值来跟踪您的按钮/图形在屏幕上的位置,因此当您按下鼠标时,您就知道要移动哪个图形。

3) 为鼠标拖动事件创建一个监听器。然后找出是否选择了您的任何按钮/图形,然后修改该按钮对象并设置新位置,例如这将与下面的代码一起使用 myGraphicObjectAssetsBox.updateLocation(point) 其中点是通过鼠标拖动得出的新位置。

4) 现在从侦听器触发重绘您的图形 glassPane,然后您的 paint 方法中的代码将自动在正确的位置绘制您的对象。类似myGlassPane.repaint();

示例绘制方法

public void paint(Graphics g)

  //pass your graphics to your object
  myGraphicObjectAssetsBox.update(g);
  myGraphicObjectLiabilitiesBox.update(g);
  myGraphicObjectOwnersEquityBox.update(g);

你的 myGraphicObject 类可能是这样的:

public class myGraphicObject

    //some values here
    Point location;
    int width, height;
    Color colorBackground;
    Color colorText;
    Font font;
    String text;
    //etc etc

    //update location so paint method is automatic
    public void updateLocation(Point newLocation)
    
        location = newLocation;
    

    //called form your paint method
    public void update(Graphics g)
    
        g.setColor(colorBackground);
        g.fillRect(location.x,location.y,width,height);
        g.setColor(colorText);
        g.setFont(font);
        g.drawString(text);
    

注意:代码只是粗略地直接输入到 SO 中,因此它很可能无法编译,并且声明是不确定的。

【讨论】:

我刚刚注意到你是如何尝试使用按钮的,所以这个答案是半过时的。但是,如果您想使用完全图形化的方法而不是使用摆动组件,您仍然可以使用此逻辑。使用 Swing 组件的问题是它们服从布局管理器,并且通常不会彼此重叠,而当您使用图形覆盖时,您可以做任何您想做的事情。有关移动按钮,请参见此处:***.com/a/11814384/1270000

以上是关于如何在 Java 中创建可拖动对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中创建可排序的表?如何从排序的对象访问类方法?

如何在 WPF 中创建可扩展的 Moebius-strip?

如何在 PyQt 中创建可折叠的盒子

如何在 Ionic 4/5 中拖动元素

如何在 Serilog 输出模板中创建可选属性?

如何在颤动中创建可滚动的行