JavaGUI编程:事件处理、颜色设置与鼠标监听
立即解锁
发布时间: 2025-08-18 01:52:50 阅读量: 1 订阅数: 9 

# Java GUI编程:事件处理、颜色设置与鼠标监听
## 1. 使用getActionCommand区分多个事件
在处理多个事件时,除了使用`getSource`方法,还可以使用`getActionCommand`方法。`getSource`方法在某些情况下存在局限性:
- **事件触发组件与监听器类不在同一类中**:监听器类的`getSource`方法能获取触发事件的组件,但无法确定返回组件的类型,因为这需要将返回的组件与原始组件进行比较(使用`==`)。如果原始组件在不同类中且为私有,在监听器类中使用它们会产生编译时错误。
- **需要使用模态组件**:模态组件是具有多种状态或模式的组件。例如,一个按钮的标签在“显示详情”和“隐藏详情”之间切换。当点击这个模态按钮时,`getSource`可以获取按钮,但无法获取按钮的模式。
`getActionCommand`方法可以解决这些问题,它返回与触发事件的组件相关联的“动作命令”,通常是组件的标签。以下是一个示例代码,展示了如何使用`getActionCommand`确定按钮的模式:
```java
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Show Details"))
{
instructions.setText(detailedInstructions);
btn.setText("HideDetails");
}
else
{
instructions.setText(briefInstructions);
btn.setText("ShowDetails");
}
} // end actionPerformed
```
## 2. 颜色设置
### 2.1 颜色方法
大多数GUI组件由两种颜色组成:前景色(文本颜色)和背景色(文本后面区域的颜色)。可以使用`setBackground`和`setForeground`方法来设置组件的颜色。以下是一个创建蓝色按钮和白色文本的示例代码:
```java
JButton btn = new JButton("Click Me");
btn.setBackground(Color.BLUE);
btn.setForeground(Color.WHITE);
```
同时,还可以使用`getBackground`和`getForeground`方法获取组件的背景色和前景色。例如:
```java
JTextField nameBox = new JTextField();
Color originalBackground = nameBox.getBackground();
Color originalForeground = nameBox.getForeground();
```
对于`JLabel`组件,其背景默认是透明的,需要先调用`label.setOpaque(true)`使其不透明,然后再设置背景色。
### 2.2 颜色命名常量
可以使用命名常量或实例化的`Color`对象来指定颜色值。`Color`类定义了一组命名常量,如`Color.BLACK`、`Color.GREEN`、`Color.RED`等。这些命名常量是类成员,可以使用`<类名>.`语法进行访问。
### 2.3 颜色对象
如果需要获取`Color`类命名常量列表中没有的颜色,可以通过指定红、绿、蓝的混合比例来实例化一个`Color`对象。`Color`构造函数的调用语法如下:
```java
new Color(<red 0–255>, <green 0–255>, <blue 0–255>)
```
每个参数都是一个介于0到255之间的整数值,表示颜色的数量。例如,以下代码将按钮的背景色设置为深洋红色:
```java
button.setBackground(new Color(128, 0, 128));
```
白色光由所有颜色组成,因此`new Color(255, 255, 255)`产生白色;黑色是所有颜色的缺失,因此`new Color(0, 0, 0)`产生黑色。
### 2.4 JFrame背景颜色设置
设置`JFrame`窗口的背景颜色比设置组件的背景颜色稍微复杂一些。首先需要获取`JFrame`的内容面板,然后将背景颜色应用到该面板上。以下是示例代码:
```java
getContentPane().add(btn);
getContentPane().setLayout(new FlowLayout());
getContentPane().setBackground(Color.YELLOW);
```
在Java 5.0之前,添加组件、设置布局和设置窗口背景颜色都需要调用`getContentPane`方法。在Java 5.0之后,添加组件和设置布局时可以省略`getContentPane`的调用,但设置窗口背景颜色仍然需要调用`getContentPane`。
### 2.5 ColorChooser程序
以下是一个完整的`ColorChooser`程序示例,实现了使用浅灰色和浅蓝色按钮来设置窗口背景颜色的功能:
```java
import javax.swing.*; // for JFrame & JButton
import java.awt.*; // for FlowLayout, Color, & Container
import java.awt.event.*; // for ActionListener & ActionEvent
public class ColorChooser extends JFrame
{
private static final int WIDTH = 300;
private static final int HEIGHT = 100;
private JButton grayButton; // changes background to gray
private JButton blueButton; // changes background to blue
public ColorChooser()
{
setTitle("Background Color Chooser");
setSize(WIDTH, HEIGHT);
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
createContents();
setVisible(true);
} // end ColorChooser constructor
private void createContents()
{
grayButton = new JButton("Gray");
grayButton.setBackground(Color.LIGHT_GRAY);
grayButton.addActionListener(new ButtonListener());
add(grayButton);
blueButton = new JButton("Blue");
blueButton.setBackground(new Color(135,206,250));
blueButton.addActionListener(new ButtonListener());
add(blueButton);
} // end createContents
private class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Container contentPane = getContentPane();
if (e.getSource() == grayButton)
{
// Change the window background color to gray.
contentPane.setBackground(Color.GRAY);
}
else
{
// Change the window background color to blue.
contentPane.setBackground(Color.BLUE);
}
} // end actionPerformed
} // end class ButtonListener
public static void main(String[] args)
{
new ColorChooser();
}
} // end class ColorChooser
```
## 3. GUI类的分组和组织
### 3.1 子包
Java API是一个庞大的类库,为了简化管理,类被组织成包的层次结构,每个包包含一组类。为了避免一个包中包含过多的类,包通常会被拆分为子包。例如,`java.awt`包中的GUI事件处理类被拆分到`java.awt.event`子包中。要导入`java.awt`包和`java.awt.event`子包中的所有类,可以使用以下语句:
```java
import java.awt.*;
import java.awt.event.*;
```
需要注意的是,不能省略`java.awt.event`的导入语句,因为编译器将`java.awt`包和`java.awt.event`子包视为完全独立的实体。
### 3.2 AWT和Swing库
在早期的Java编译器中,所有GUI类都被捆绑在一个名为Abstract Windowing Toolkit(AWT)的库中。AWT的GUI命令生成的组件在不同平台上的外观不同,这会导致可移植性问题。为了解决这个问题,Sun开发了一个新的库Swing,其中包含了更具可移植性的GUI组件。Swing组件的名称通常以“J”开头,例如`JButton`。
AWT组件被称为重量级组件,因为它们是使用计算机平台的图形命令构建的,难以移植到其他平台。Swing组件被称为轻量级组件,因为它们是用Java代码构建的,更容易移植到不同的平台。
如今,Java GUI应用程序开发人员通常同时使用AWT和Swing库。主要的AWT包是`java.awt`和`java.awt.event`,主要的Swing包是`javax.swing`。
以下是AWT和Swing库的对比表格:
| 特性 | AWT | Swing |
| ---- | ---- | ---- |
| 组件类型 | 重量级组件 | 轻量级组件 |
| 可移植性 | 较差 | 较好 |
| 外观 | 不同平台外观不同 | 跨平台外观一致 |
### 3.3 鼠标监听器和图像
#### 3.3.1 鼠标监听器
鼠标监听器用于处理用户使用鼠标进行的操作。创建鼠标监听器的基本步骤与创建`ActionListener`类似:定义一个监听器类,在监听器类中定义事件处理方法,并将监听器类注册到组件上。
有两种类型的鼠标监听器,分别由`MouseListener`和`MouseMotionListener`接口定义。以下是这两个接口中方法的API头和描述:
| 接口 | 方法 | 描述 |
| ---- | ---- | ---- |
| MouseListener | `mouseClicked(MouseEvent event)` | 当用户在`MouseListener`注册的组件上按下并释放鼠标按钮,且鼠标光标静止时调用 |
| MouseListener | `mouseEntered(MouseEvent event)` | 当鼠标光标进入`MouseListener`注册的组件的边界时调用 |
| MouseListener | `mouseExited(MouseEvent event)` | 当鼠标光标离开`MouseListener`注册的组件的边界时调用 |
| MouseListener | `mousePressed(MouseEvent event)` | 当用户在`MouseListener`注册的组件上按下鼠标按钮时调用 |
| MouseListener | `mouseRele
0
0
复制全文
相关推荐










