Swing和模型-视图-控制器设计模式
用户界面组件各个组成部分,如按钮,复选框,文本框或复杂的树控件,每个组件都有三个特征:
- 内容,如按钮的状态,文本域中的文本。
- 外观,颜色,大小等。
- 行为,对事件的反映。
Swing设计者采用了一种很有名的设计模式:MVC
- 模型(model):存储内容。
- 视图(view):显示内容。
ButtonModel接口属性
- actionCommand,与按钮关联的动作命令字符串
- mnemonic,按钮的助记快捷键
- armed,按钮按下且鼠标仍在按钮上则为true
- enabled,按下按钮钮时可选择的则为true
- pressed,按钮按下且鼠标按键没释放则为true
- rollover,鼠标在按钮上则为true
- selected,按钮已经被选择(复选框和单选按钮),则为true。
每个JButton对象都存储着一个按钮对象:
var button = new JButton("Blue");
ButtonModel model = button.getModel();
JButton继承自JComponent,包含DefaultButtonModel对象,BasicButtonUI对象。
package swing;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class ButtonModelTest {public static void main(String[] args) {JFrame frame = new JFrame("ButtonModel");JPanel buttonPanel = new JPanel();JLabel jLabel = new JLabel("ButtonModel",JLabel.CENTER);JButton jButton = new JButton("操作按钮");frame.add(jLabel,BorderLayout.CENTER);buttonPanel.add(jButton);frame.add(buttonPanel,BorderLayout.SOUTH);ButtonModel bm = jButton.getModel();jButton.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("松开鼠标!");}@Overridepublic void mousePressed(MouseEvent e) {
// System.out.println("按下鼠标!");if(bm.isArmed()) {System.out.println("按钮按下且鼠标仍在按钮上!");}if(bm.isPressed()) {System.out.println("按钮按下且鼠标按键没释放!");}}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {
// System.out.println("鼠标进入按钮区域!");if(bm.isRollover()) {System.out.println("鼠标在按钮上!");}}@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("单击鼠标!");}});frame.setSize(600, 400);//初始打开为屏幕中央Toolkit toolkit = Toolkit.getDefaultToolkit();Dimension screenSize = toolkit.getScreenSize();int screenWidth = (int) screenSize.getWidth();int screenHeight = (int) screenSize.getHeight();//计算窗口位置int x = (screenWidth - frame.getWidth())/2;int y = (screenHeight - frame.getHeight())/2;frame.setLocation(x, y);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}