修改程序Example11_13.java,要求按照MVC开发模式来编写,设计一个MathListener.java,实现对ActionEvent事件的监听,不再使用窗体做监视器对象。请同学们考虑一下,MathListener.java、WindowTriangle.java、Triangle.java这三个类分别属于哪个模式
时间: 2024-04-21 15:27:50 浏览: 9
根据题目描述,可以将程序按照MVC模式进行重构,具体的类可以划分如下:
- Model:Triangle.java,负责处理数据和业务逻辑。
- View:WindowTriangle.java,负责用户界面的显示和用户交互。
- Controller:MathListener.java,负责监听用户事件,并将事件传递给Model进行处理。
因此,MathListener.java属于Controller,WindowTriangle.java属于View,Triangle.java属于Model。
相关问题
修改程序Example11_13.java,要求按照MVC开发模式来编写,设计一个MathListener.java,实现对ActionEvent事件的监听,不再使用窗体做监视器对象
下面是重构后的程序,按照MVC模式进行了设计:
Triangle.java (Model)
```java
public class Triangle {
private double a, b, c;
public Triangle() {
a = b = c = 0;
}
public void setA(double a) {
this.a = a;
}
public void setB(double b) {
this.b = b;
}
public void setC(double c) {
this.c = c;
}
public double getArea() {
double p = (a + b + c) / 2;
return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
}
```
WindowTriangle.java (View)
```java
import javax.swing.*;
import java.awt.*;
public class WindowTriangle extends JFrame {
private JTextField txtA, txtB, txtC, txtArea;
private JButton btnCalc;
public WindowTriangle() {
setTitle("Triangle");
setSize(250, 150);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p1 = new JPanel(new GridLayout(4, 2));
p1.add(new JLabel("Side A:"));
txtA = new JTextField(5);
p1.add(txtA);
p1.add(new JLabel("Side B:"));
txtB = new JTextField(5);
p1.add(txtB);
p1.add(new JLabel("Side C:"));
txtC = new JTextField(5);
p1.add(txtC);
p1.add(new JLabel("Area:"));
txtArea = new JTextField(10);
txtArea.setEditable(false);
p1.add(txtArea);
JPanel p2 = new JPanel();
btnCalc = new JButton("Calculate");
p2.add(btnCalc);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
}
public double getA() {
return Double.parseDouble(txtA.getText());
}
public double getB() {
return Double.parseDouble(txtB.getText());
}
public double getC() {
return Double.parseDouble(txtC.getText());
}
public void setArea(double area) {
txtArea.setText(String.format("%.2f", area));
}
public void addMathListener(MathListener listener) {
btnCalc.addActionListener(listener);
}
}
```
MathListener.java (Controller)
```java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MathListener implements ActionListener {
private Triangle model;
private WindowTriangle view;
public MathListener(Triangle model, WindowTriangle view) {
this.model = model;
this.view = view;
}
@Override
public void actionPerformed(ActionEvent e) {
try {
double a = view.getA();
double b = view.getB();
double c = view.getC();
model.setA(a);
model.setB(b);
model.setC(c);
double area = model.getArea();
view.setArea(area);
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(view, "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
```
Example11_13.java (Main)
```java
public class Example11_13 {
public static void main(String[] args) {
Triangle model = new Triangle();
WindowTriangle view = new WindowTriangle();
MathListener controller = new MathListener(model, view);
view.addMathListener(controller);
view.setVisible(true);
}
}
```
重构后,程序按照MVC模式进行了设计,MathListener.java实现了对ActionEvent事件的监听,不再使用窗体做监视器对象。
java实现菜单监听事件实现多个ActionEvent
Java 实现菜单监听事件(MenuListener)可以通过实现多个 ActionEvent 来实现多个事件的处理。每个 ActionEvent 将被分配一个唯一的标识符,以便您可以确定哪个事件已被触发。
下面是一个简单的示例代码,演示如何使用 MenuListener 监听菜单事件并实现多个 ActionEvent:
```java
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
public class MenuListenerExample extends JFrame implements MenuListener {
private final int NEW_FILE = 1;
private final int OPEN_FILE = 2;
private final int SAVE_FILE = 3;
public MenuListenerExample() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.addMenuListener(this);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
new MenuListenerExample();
}
@Override
public void menuSelected(MenuEvent e) {
JMenu menu = (JMenu) e.getSource();
if (menu.getText().equals("File")) {
JMenuItem newFile = new JMenuItem("New File");
newFile.setActionCommand(String.valueOf(NEW_FILE));
newFile.addActionListener(this::actionPerformed);
menu.add(newFile);
JMenuItem openFile = new JMenuItem("Open File");
openFile.setActionCommand(String.valueOf(OPEN_FILE));
openFile.addActionListener(this::actionPerformed);
menu.add(openFile);
JMenuItem saveFile = new JMenuItem("Save File");
saveFile.setActionCommand(String.valueOf(SAVE_FILE));
saveFile.addActionListener(this::actionPerformed);
menu.add(saveFile);
}
}
@Override
public void menuDeselected(MenuEvent e) {}
@Override
public void menuCanceled(MenuEvent e) {}
public void actionPerformed(ActionEvent e) {
switch (Integer.parseInt(e.getActionCommand())) {
case NEW_FILE:
System.out.println("New File");
break;
case OPEN_FILE:
System.out.println("Open File");
break;
case SAVE_FILE:
System.out.println("Save File");
break;
default:
System.out.println("Unknown Event");
break;
}
}
}
```
在这个例子中,我们创建了一个 JMenu 对象,并在菜单被选中时,创建了三个 JMenuItem 对象,并将它们添加到了菜单中。每个 JMenuItem 对象都分配了一个唯一的标识符,并使用 setActionCommand 方法将其设置为相应的事件类型。每个 JMenuItem 对象还使用 addActionListener 方法将监听器与相应的事件处理方法关联起来。
在 actionPerformed 方法中,我们使用 switch 语句根据事件类型执行相应的操作。在本例中,我们输出了相应的消息,但您可以根据需要执行任何操作。