java 图形界面 mvc模式控制
使用模型-视图-控件结构来开发GUI程序。
下面的程序演示了MVC模式开发的java程序。
其中CircleModel为模型,包含了圆的半径,是否填充,等属性。
CircleView为视图,显示这个圆。
CircleController为控制器,控制圆的大小,以及是否被填充。
模型:
package circleMVC; import java.awt.Color;
import java.awt.event.*;
import java.util.*; public class CircleModel {
//圆半径
private double radius = 20; //是否填充
private boolean filled; //颜色
private java.awt.Color color; private ArrayList<ActionListener> actionListenerList; public double getRadius() {
return radius;
} public void setRadius(double radius) {
this.radius = radius;
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "radius"));//当属性值改变是通知监听器
} public boolean isFilled() {
return filled;
} public void setFilled(boolean filled) {
this.filled = filled;
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "filled"));//当属性值改变是通知监听器
} public java.awt.Color getColor() {
return color;
} public void setColor(java.awt.Color color) {
this.color = color;
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "color"));//当属性值改变是通知监听器
} public synchronized void addActionListener(ActionListener l){
if(actionListenerList == null){
actionListenerList = new ArrayList<ActionListener>();
}
actionListenerList.add(l);
} public synchronized void removeActionListener(ActionListener l){
if(actionListenerList != null && actionListenerList.contains(l)){
actionListenerList.remove(l);
}
} private void processEvent(ActionEvent e){
ArrayList list; synchronized(this){
if(actionListenerList == null) return;
list = (ArrayList)actionListenerList.clone();
}
for(int i = 0; i < list.size(); i++){
ActionListener listener = (ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
}
视图:
package circleMVC; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleView extends JPanel implements ActionListener{
private CircleModel model; public void actionPerformed(ActionEvent actionEvent){
repaint();
} //设置一个model
public void setModel(CircleModel newModel) {
model = newModel; if(model != null){
//给model增加啊监听器
model.addActionListener(this);
} repaint();
} public CircleModel getModel(){
return model;
} public void paintComponent(Graphics g){
super.paintComponent(g); if(model == null) return; g.setColor(model.getColor()); int xCenter = getWidth() / 2;
int yCenter = getHeight() / 2;
int radius = (int)model.getRadius(); if(model.isFilled()) {
g.fillOval(xCenter - radius, yCenter - radius, 2 * radius, 2 * radius);
}else{
g.drawOval(xCenter - radius, yCenter - radius, 2 * radius, 2 * radius);
}
}
}
控制器
package circleMVC; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleController extends JPanel{
private CircleModel model;
private JTextField jtfRadius = new JTextField();
@SuppressWarnings("unchecked")
private JComboBox jcboFilled = new JComboBox(new Boolean[]{
new Boolean(false), new Boolean(true)
});
private JRadioButton jrbRed, jrbGreen, jrbBlue; //创建一个新的CircleController
public CircleController(){
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(2,1));
panel1.add(new JLabel("Radius"));
panel1.add(new JLabel("Filled")); //
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(2,1));
panel2.add(jtfRadius);
panel2.add(jcboFilled); JPanel panel3 = new JPanel();
panel3.setLayout(new GridLayout(1, 3));
panel3.add(jrbRed = new JRadioButton("Red"));
panel3.add(jrbGreen = new JRadioButton("Green"));
panel3.add(jrbBlue = new JRadioButton("Blue")); setLayout(new BorderLayout());
add(panel1, BorderLayout.WEST);
add(panel2, BorderLayout.CENTER);
add(panel3, BorderLayout.SOUTH); //将三个单选框组成单选按钮
ButtonGroup group = new ButtonGroup();
group.add(jrbRed);
group.add(jrbGreen);
group.add(jrbBlue); jtfRadius.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(model == null) return ;//还没有model
model.setRadius(new Double(jtfRadius.getText()).doubleValue());
}
}); jcboFilled.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setFilled( ((Boolean)jcboFilled.getSelectedItem()).booleanValue());
}
}); //单选按钮监听
jrbRed.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.RED);
}
}); jrbGreen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.GREEN);
}
}); jrbBlue.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.BLUE);
}
});
} public void setModel(CircleModel newModel){
model = newModel;
} public CircleModel getModel() {
return model;
}
}
MVCDemo:
package circleMVC; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MVCDemo extends JApplet {
private JButton jbtController = new JButton("Show Contuoller");
private JButton jbtView = new JButton("Show View");
private CircleModel model = new CircleModel(); public MVCDemo() {
setLayout(new FlowLayout());
add(jbtController);
add(jbtView); jbtController.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { JFrame frame = new JFrame("Controller");
CircleController controller = new CircleController();
controller.setModel(model);
frame.add(controller);
frame.setSize(240, 100);
frame.setLocation(200, 200);
frame.setVisible(true);
}
}); jbtView.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
JFrame frame = new JFrame("view");
CircleView view = new CircleView();
view.setModel(model);
frame.add(view);
frame.setSize(200, 200);
frame.setLocation(200, 200);
frame.setVisible(true);
}
});
} }
运行效果:
aaarticlea/png;base64,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" alt="" />
二、
在同一个窗口中使用MVC模式,控制器和视图都在同一个窗口中,可以使用鼠标拖动来控制半径,也可以使用输入来控制半径,同时面积和体积要同步更新。
难点:在同一个窗口中,控制器的数据怎么和视图的数据进行交互,而且要同步显示,控制器和视图相互交错,控制器也是视图,视图也是控制器。
代码如下:
模型:
/**
* java MVC模式 模型部分
* 2016/5/22
*/
package circleMVC_x; import java.awt.Color;
import java.awt.event.*;
import java.util.*; public class CircleModel {
//圆半径
private double radius = 20; //是否填充
private boolean filled; //颜色
private java.awt.Color color; private ArrayList<ActionListener> actionListenerList; public double getRadius() {
return radius;
} public void setRadius(double radius) {
this.radius = radius;
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "radius"));//当属性值改变是通知监听器
} public boolean isFilled() {
return filled;
} public void setFilled(boolean filled) {
this.filled = filled;
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "filled"));//当属性值改变是通知监听器
} public java.awt.Color getColor() {
return color;
} public void setColor(java.awt.Color color) {
this.color = color;
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "color"));//当属性值改变是通知监听器
} public synchronized void addActionListener(ActionListener l){
if(actionListenerList == null){
actionListenerList = new ArrayList<ActionListener>();
}
actionListenerList.add(l);
} public synchronized void removeActionListener(ActionListener l){
if(actionListenerList != null && actionListenerList.contains(l)){
actionListenerList.remove(l);
}
} private void processEvent(ActionEvent e){
ArrayList list; synchronized(this){
if(actionListenerList == null) return;
list = (ArrayList)actionListenerList.clone();
}
for(int i = 0; i < list.size(); i++){
ActionListener listener = (ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
}
模型
控制器:
/**
* java MVC模式 控制器部分(其中面积,体积部分不能设置,算作视图)
* 2016/5/22
*/
package circleMVC_x; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleController extends JPanel implements ActionListener{
private CircleModel model;
private JTextField jtfRadius = new JTextField();
private JTextField jtfArea = new JTextField();
private JTextField jtfVolume= new JTextField();
private JRadioButton jrbRed, jrbGreen, jrbBlue; //创建一个新的CircleController
public CircleController(){
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(3,1));
panel1.add(new JLabel("半径:"));
panel1.add(new JLabel("面积:"));
panel1.add(new JLabel("体积:")); //
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(3,1));
panel2.add(jtfRadius);
panel2.add(jtfArea);
panel2.add(jtfVolume); JPanel panel3 = new JPanel();
panel3.setLayout(new GridLayout(1, 3));
panel3.add(jrbRed = new JRadioButton("Red"));
panel3.add(jrbGreen = new JRadioButton("Green"));
panel3.add(jrbBlue = new JRadioButton("Blue")); setLayout(new BorderLayout());
add(panel1, BorderLayout.WEST);
add(panel2, BorderLayout.CENTER);
add(panel3, BorderLayout.SOUTH); //将三个单选框组成单选按钮
ButtonGroup group = new ButtonGroup();
group.add(jrbRed);
group.add(jrbGreen);
group.add(jrbBlue); jtfRadius.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(model == null) return ;//还没有model
model.setRadius(new Double(jtfRadius.getText()).doubleValue());
}
}); //单选按钮监听
jrbRed.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.RED);
}
}); jrbGreen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.GREEN);
}
}); jrbBlue.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.BLUE);
}
});
} public void setModel(CircleModel newModel){
model = newModel;
if(model != null){
//给model增加啊监听器
model.addActionListener(this);
}
} public CircleModel getModel() {
return model;
} @Override
public void actionPerformed(ActionEvent e) {
double radius = model.getRadius();
jtfRadius.setText(model.getRadius()+"");
double num_1 = 4 * Math.PI * radius * radius;
double num_1_1 = (Math.round(num_1 * 100) / 100.0);// 保留两位小数
jtfArea.setText(num_1_1+"");
double num_2 = 4 / 3 * Math.PI * radius * radius;
double num_2_2 = (Math.round(num_2 * 100) / 100.0);// 保留两位小数
jtfVolume.setText(num_2_2+""); }
}
控制器
视图:
/**
* java MVC模式 视图部分
* 2016/5/22
*/
package circleMVC_x; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleView extends JPanel implements ActionListener{
private CircleModel model; public CircleView(){
super.setBounds(12, 144, 426, 300);
repaint();
//增加鼠标监听事件
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e){
model = getModel(); int x = e.getX();
int y = e.getY();
int radius; double radius_d = Math.sqrt((x - (getWidth() / 2))
* (x - (getWidth() / 2)) + (y - (getHeight() / 2))
* (y - (getHeight() / 2))); radius = (int) radius_d; System.out.println("坐标:" + x + " " + y );
model.setRadius(radius);
repaint(); }
});
}
public void actionPerformed(ActionEvent actionEvent){
repaint();
} //设置一个model
public void setModel(CircleModel newModel) {
model = newModel; if(model != null){
//给model增加啊监听器
model.addActionListener(this);
} repaint();
} public CircleModel getModel(){
return model;
} public void paintComponent(Graphics g){
super.paintComponent(g); if(model == null) return; g.setColor(model.getColor()); int radius = (int)model.getRadius(); g.drawOval(getWidth() / 2 - radius, getHeight() / 2 - radius,
2 * radius, 2 * radius);
g.drawOval(getWidth() / 2 - radius / 2, getHeight() / 2 - radius,
radius, 2 * radius);
g.drawOval(getWidth() / 2 - radius, getHeight() / 2 - radius / 2,
2 * radius, radius);
}
}
视图
程序入口:
/**
* javaMVC模式 入口
* 2016/6/20
*/
package circleMVC_x; import java.awt.BorderLayout;
import java.awt.EventQueue; import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.FlowLayout; public class MVCdemo_x extends JFrame { private JPanel contentPane;
private CircleController controller = new CircleController();
private CircleView view = new CircleView();
private CircleModel model = new CircleModel(); /**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MVCdemo_x frame = new MVCdemo_x();
frame.setSize(500, 500);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame.
*/
public MVCdemo_x() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null); JPanel panel = new JPanel();
controller.setModel(model);
panel.add(controller);
panel.setBounds(57, 34, 310, 98);
contentPane.add(panel); view.setModel(model);
contentPane.add(view);
}
}
程序入口
运行结果:
aaarticlea/png;base64,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" alt="" />
java 图形界面 mvc模式控制的更多相关文章
- Java 图形界面开发--图文并茂建立学生管理系统
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/50932501 冷血之心的博客) 图形用户界面(Graphics U ...
- Java图形界面学习---------简易登录界面
/** * @author Administrator * Java图形界面学习---------简易登录界面 * date:2015/10/31 */ import java.awt.BorderL ...
- Java图形界面GUI
Java图形界面GUI 设置窗体JFrame对象 package com.Aha.Best; import javax.swing.ImageIcon; import javax.swing.JFra ...
- Java第5次实验提纲(Java图形界面编程)
1. Swing与NetBeans 使用NetBeans编写简单界面.见GUI实验参考文件中的0.第06次实验(图形程序设计.事件处理与Swing).doc 题目1: Swing用户界面组件与事件处理 ...
- Java第05次实验提纲(Java图形界面编程)
1. Swing与NetBeans 使用NetBeans编写简单界面.见GUI实验参考文件中的0.第06次实验(图形程序设计.事件处理与Swing).doc 题目1: Swing用户界面组件与事件处理 ...
- JAVA学习篇--JAVA两种编程模式控制
在Drp项目中,解说了两种编程模式Model 1和Model2.以下是对这两种模式的简单理解.以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下. ...
- centos7命令行与图形界面启动模式修改
1.命令启动 systemctl set-default multi-user.target 2.图形界面模式 systemctl set-default graphical.target
- java 图形界面 Socket编程
一.使用图形界面实现客户端服务器端的通信: 上代码: 服务器端代码: package cn.MyNET; import java.io.*; import java.net.*; import jav ...
- java 图形界面
1.创建一个窗口框架 /** * java 用户界面框架 * 2016/5/10 */ package org.windows; import javax.swing.*; public class ...
随机推荐
- python hmac-sha1
def getSignature(Token,paramss1): s = getParam(paramss1) print(s) # for k, v in paramss1.items(): # ...
- Java常用术语及区别
Java中总有几个术语,平时说的多,但是还是让人有点摸不着头脑,今天就来解析一下他们的区别: l JDK:Java development toolkit,是 Java 语言的软件开发工具包(SDK) ...
- open("","r")与open("","rb")的效率区别
fd = open("C:\Users\william\Desktop\dup_file - Copy (3).txt","r")for i in fd: pr ...
- Linux kernel Vhost-net 和 Virtio-net代码详解
场景 Host上运行qemu kvm虚拟机,其中虚拟机的网卡类型为virtio-net,而Host上virtio-net backend使用vhost-net 数据包进入虚拟机代码分析 首先看vhos ...
- 安装mysql的遇到的问题
源:安装用的是mysql官网的binary包. 之前装mysql都是直接放到/usr/local,就想试试放到其他地方,然后..就悲剧了. 安装步骤没啥说的,官网上有.因为放置的位置不一样所以有些执行 ...
- ERROR Worker: All masters are unresponsive! Giving up
启动spark的时候发现,主节点(master)上的Master进程还在,子节点(Worker)上的Worker进程自动关闭. 在子节点上查询log发现: ERROR Worker: All mast ...
- 修改MANIFEST.MF方法
步骤: 1.用winrar等其他解压工具,右键选择"用winrar打开": 2.找到MANIFEST.MF文件,鼠标左键拖拽到桌面: 3.最后一行加入Main-Class:(空格) ...
- javaWEB总结(8):自定义GenericServlet
前言: 项目的实际应用中,我们往往为了方便去继承GenericServlet类,而不是去实现Servlet接口,是什么原因呢?下面进行简单的实践操作. 一. 准备工作 1.首先看GenericServ ...
- Linux下安装awstats日志统计分析
1. 下载安装 cd /data/software wget http://prdownloads.sourceforge.net/awstats/awstats-7.0-1.noarch.rpm 2 ...
- 获取生日对应星座的PHP函数
PHP 获取指定日期对应的星座名称 /** * 获取指定日期对应星座 * * @param integer $month 月份 1-12 * @param integer $day 日期 1-31 * ...