Java Swing中的控制器是什么?

我想以有意义的方式使用Swing将MVC设计应用于Java应用程序。因此,我的问题是,如何在Java Swing中构造控制器?

我有两个选择:

  1. 每个组件侦听器都是自己的类,作为控制器包的一部分
  2. 每个组件侦听器都是视图包中的一个匿名类,该类将其调用委托给具有控制器方法的类。

两者都有可能吗?是偏好问题还是明确定义的?

回答:

Controller构成了组件接口的另一半,主要是交互的一半。控制器负责鼠标和键盘事件。

在Swing JButton等组件中是控制器。所有侦听器类都将事件重定向到具有您的业务逻辑的模型

例如:

import javax.swing.*;

public class CalcMVC {

//... Create model, view, and controller. They are

// created once here and passed to the parts that

// need them so there is only one copy of each.

public static void main(String[] args) {

CalcModel model = new CalcModel();

CalcView view = new CalcView(model);

CalcController controller = new CalcController(model, view);

view.setVisible(true);

}

}

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

class CalcView extends JFrame {

//... Constants

private static final String INITIAL_VALUE = "1";

//... Components

private JTextField m_userInputTf = new JTextField(5);

private JTextField m_totalTf = new JTextField(20);

private JButton m_multiplyBtn = new JButton("Multiply");

private JButton m_clearBtn = new JButton("Clear");

private CalcModel m_model;

//======================================================= constructor

/** Constructor */

CalcView(CalcModel model) {

//... Set up the logic

m_model = model;

m_model.setValue(INITIAL_VALUE);

//... Initialize components

m_totalTf.setText(m_model.getValue());

m_totalTf.setEditable(false);

//... Layout the components.

JPanel content = new JPanel();

content.setLayout(new FlowLayout());

content.add(new JLabel("Input"));

content.add(m_userInputTf);

content.add(m_multiplyBtn);

content.add(new JLabel("Total"));

content.add(m_totalTf);

content.add(m_clearBtn);

//... finalize layout

this.setContentPane(content);

this.pack();

this.setTitle("Simple Calc - MVC");

// The window closing event should probably be passed to the

// Controller in a real program, but this is a short example.

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

void reset() {

m_totalTf.setText(INITIAL_VALUE);

}

String getUserInput() {

return m_userInputTf.getText();

}

void setTotal(String newTotal) {

m_totalTf.setText(newTotal);

}

void showError(String errMessage) {

JOptionPane.showMessageDialog(this, errMessage);

}

void addMultiplyListener(ActionListener mal) {

m_multiplyBtn.addActionListener(mal);

}

void addClearListener(ActionListener cal) {

m_clearBtn.addActionListener(cal);

}

}

import java.awt.event.*;

public class CalcController {

//... The Controller needs to interact with both the Model and View.

private CalcModel m_model;

private CalcView m_view;

//========================================================== constructor

/** Constructor */

CalcController(CalcModel model, CalcView view) {

m_model = model;

m_view = view;

//... Add listeners to the view.

view.addMultiplyListener(new MultiplyListener());

view.addClearListener(new ClearListener());

}

////////////////////////////////////////// inner class MultiplyListener

/** When a mulitplication is requested.

* 1. Get the user input number from the View.

* 2. Call the model to mulitply by this number.

* 3. Get the result from the Model.

* 4. Tell the View to display the result.

* If there was an error, tell the View to display it.

*/

class MultiplyListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

String userInput = "";

try {

userInput = m_view.getUserInput();

m_model.multiplyBy(userInput);

m_view.setTotal(m_model.getValue());

} catch (NumberFormatException nfex) {

m_view.showError("Bad input: '" + userInput + "'");

}

}

}//end inner class MultiplyListener

//////////////////////////////////////////// inner class ClearListener

/** 1. Reset model.

* 2. Reset View.

*/

class ClearListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

m_model.reset();

m_view.reset();

}

}// end inner class ClearListener

}

import java.math.BigInteger;

public class CalcModel {

//... Constants

private static final String INITIAL_VALUE = "0";

//... Member variable defining state of calculator.

private BigInteger m_total; // The total current value state.

//============================================================== constructor

/** Constructor */

CalcModel() {

reset();

}

//==================================================================== reset

/** Reset to initial value. */

public void reset() {

m_total = new BigInteger(INITIAL_VALUE);

}

//=============================================================== multiplyBy

/** Multiply current total by a number.

*@param operand Number (as string) to multiply total by.

*/

public void multiplyBy(String operand) {

m_total = m_total.multiply(new BigInteger(operand));

}

//================================================================= setValue

/** Set the total value.

*@param value New value that should be used for the calculator total.

*/

public void setValue(String value) {

m_total = new BigInteger(value);

}

//================================================================= getValue

/** Return current calculator total. */

public String getValue() {

return m_total.toString();

}

}

以上是 Java Swing中的控制器是什么? 的全部内容, 来源链接: utcz.com/qa/409246.html

回到顶部