javaGUI学习33:AWT-拖放技术

1、java.awt.dnd软件包

提供拖操作源,放操作目的地,拖操作意图识别器,以及相关事件与监听者类。

java.awt. dnd 软件包中的类一般分为3种,分别为识别器、拖动源以及放置目标。

其中,拖动源与放置目标又分别由一组事件类型与监听者组成。

另外,拖动源与放置目标都拥有–个环境对象,它为放置目标同位体保持拖动源的状态。

2、拖动源与放置目标
  • 拖动源与放置目标是支持拖放操作中的基本块。
  • 拖动源由DragSource类描述,它利用DragSource.startDrag方法启动一个拖动操作。
  • 放置目标则由Drop Target类描述,它是利用Droplarget . drop方法放置操作对象的目的地。
  • 拖放操作都是由意图启动的。通常,表达意图时需要将鼠标拖动到拖动源边界的外部。但是,意图是与窗口系统相关的一种操作。
  • java. awt.drd软件包中提供的 DragGestureRecognizer类可用于检测拖动意图,而DragCestureRecognizer类实例则可从拖动源中获得。
  • 识别器通知拖动意图监听者,一个拖动意图事件发生在相关拖动源中。拖动意图监听者接收到该事件后,可以利用DragSource .startDrag ()方法启动拖动操作。
拖放操作步骤:
只要时刻牢记拖放操作的3个主要组成部分:拖动源、放置目标以及拖动意图监听者,则拖放操作的实现相当简单:
1)产生待使用的DragSource、DropTarget以及 DragGestureRecognizer实例。
2)分别实现如上所述各个实例的监听者:DragSourceListener、DropTargetListener以及DragCcstureRecognizerListener。其中,DragSourceListener一般利用DragSource.star-tDrag ()方法启拖动操作;DroplargetListener 用于监视放置操作的状态;DragCesture-RecognizerListener则用于接受或拒绝拖动操作并完成放置操作。
2.1 拖动意图

检测拖动源的拖动意图是DragSourceRecognizer方法的工作。拖动意图识别器是单一预测(unicast)事件源,当相关拖动源中产生一个拖动意图时,则本地同位体通知拖动意图识别器。然后,意图识别器通知实现DragGestureListener接口的监听者。

2.2 拖动源

拖动源启动拖动操作,并创建拖动意图识别器。一般利用如下方式使用拖动源:

  • 利用无参数DragSource构造器创建一个DragSource实例。

  • 从拖动源中获取 DragGestureRecognizer实例。

  • 当检测到拖动意图时,调用DragSource .startDrag ()方法。

2.3 放置目标

与拖动源相似,放置目标是一个意图的目标。典型的放置意图由在与放置目标相关的构件内释放鼠标组成。同时,与拖动源相同,放置意图的定义也与窗口系统相关。
与拖动源相比较,放置目标实际上更像拖动意图识别器。放置目标与识别器都是单一预测事件源;每个放置目标都拥有唯一一个Drop’TargetListener类型的放置目标监听者。
另外,创建放置目标时涉及的相关对象包括放置目标、构件以及放置目标监听者。在初始化 Drop’Target 的实例后,如果在构件中检测到放置意图,则每个对象都将被通知开始执行相应的动作。与DragGestureRecognizer实例相似,实际上识别器与放置目标在初始化后,一般都很少再次使用。

2.4 事件

提供了传递到上面三个Listener方法的事件,一组事件类。

拖动意图事件可以启动拖动操作,因此当检测到某个拖动意图后,你不必直接访问拖动源。

另外,DragGestureEvent实例被传递到DragSource.startDrag ()方法与DragGestureListener. dra-gCestureRecognized ()方法。

2.5 DragSourceDragEvent与DragSourceDrogEvent

DragSourceDragEvent 与 DragSourceDropEvent实例被传递到 DragSourceListener 接口定义的方法中。DragSourceDragEvent与DragSourceDropEvent分别与放置目标中发生的拖动事件和放置事件相关。

2.6 DropTargetDragEvent与DropTargetDropEvent

DropTargetDragEvent与DropTargetDropEvent实例被传递到 DropTargetListener 接口定义的公共方法。DropTlargetDragEvent与 DropTargetDropEvent分别与放置目标中发生的拖动事件和放置事件相关。

2.7 自动滚动

自动滚动是指当将拖动鼠标放置在某一偏差范围内时,放置目标可以自动实现内容的滚动显示。例如:Windows Explorer中,位于左侧框中的树行控制结构即是一个自动滚动的放置目标。如果将某个项目拖动到树形结构中,并将鼠标放置在顶部或底部附近,则树会向鼠标方向滚动。
自动滚动目标是利用java. awt . dnd.Autoscroll接口实现的,这个接口定义了两个方法:

public Insets getAutoscrollInsets ()
public void autoscroll (Point)

其中,getAutoscrollInsets方法用于确定拖动鼠标的位置是否应该引发自动滚动操作。如果要引发自动滚动操作,则只要鼠标保留在自动滚动偏差区域内,就周期性地激活autoscroll ()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于Java GUI编程实现计算器,你可以使用Swing和AWT这两种Java GUI工具包之一。 以下是一个简单的Java GUI计算器的实现示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calculator extends JFrame implements ActionListener { private JButton[] numberButtons; private JButton[] operatorButtons; private JButton clearButton, equalsButton, decimalButton; private JTextField textField; private double num1 = 0, num2 = 0, result = 0; private char operator; public Calculator() { setTitle("Calculator"); // Create the number buttons numberButtons = new JButton[10]; for (int i = 0; i < 10; i++) { numberButtons[i] = new JButton(String.valueOf(i)); } // Create the operator buttons operatorButtons = new JButton[4]; operatorButtons[0] = new JButton("+"); operatorButtons[1] = new JButton("-"); operatorButtons[2] = new JButton("*"); operatorButtons[3] = new JButton("/"); // Create the clear, equals, and decimal buttons clearButton = new JButton("C"); equalsButton = new JButton("="); decimalButton = new JButton("."); // Create the text field textField = new JTextField(10); textField.setEditable(false); // Set the layout manager and add the components setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.gridx = 0; gc.gridy = 0; gc.gridwidth = 4; add(textField, gc); gc.gridwidth = 1; gc.gridy = 1; for (int i = 0; i < 10; i++) { gc.gridx = i % 3; gc.gridy = i / 3 + 2; add(numberButtons[i], gc); numberButtons[i].addActionListener(this); } gc.gridx = 0; gc.gridy = 5; add(operatorButtons[0], gc); operatorButtons[0].addActionListener(this); gc.gridx = 1; add(operatorButtons[1], gc); operatorButtons[1].addActionListener(this); gc.gridx = 2; add(operatorButtons[2], gc); operatorButtons[2].addActionListener(this); gc.gridx = 3; add(operatorButtons[3], gc); operatorButtons[3].addActionListener(this); gc.gridx = 0; gc.gridy = 6; add(clearButton, gc); clearButton.addActionListener(this); gc.gridx = 1; add(equalsButton, gc); equalsButton.addActionListener(this); gc.gridx = 2; add(decimalButton, gc); decimalButton.addActionListener(this); setSize(200, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void actionPerformed(ActionEvent e) { for (int i = 0; i < 10; i++) { if (e.getSource() == numberButtons[i]) { textField.setText(textField.getText() + i); } } if (e.getSource() == decimalButton) { textField.setText(textField.getText() + "."); } if (e.getSource() == clearButton) { textField.setText(""); num1 = 0; num2 = 0; result = 0; operator = ' '; } if (e.getSource() == operatorButtons[0]) { num1 = Double.parseDouble(textField.getText()); operator = '+'; textField.setText(""); } if (e.getSource() == operatorButtons[1]) { num1 = Double.parseDouble(textField.getText()); operator = '-'; textField.setText(""); } if (e.getSource() == operatorButtons[2]) { num1 = Double.parseDouble(textField.getText()); operator = '*'; textField.setText(""); } if (e.getSource() == operatorButtons[3]) { num1 = Double.parseDouble(textField.getText()); operator = '/'; textField.setText(""); } if (e.getSource() == equalsButton) { num2 = Double.parseDouble(textField.getText()); switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; } textField.setText(Double.toString(result)); } } public static void main(String[] args) { new Calculator(); } } ``` 这个示例应该可以实现一个简单的Java GUI计算器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值