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() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("松开鼠标!");
}
@Override
public void mousePressed(MouseEvent e) {
// System.out.println("按下鼠标!");
if(bm.isArmed()) {
System.out.println("按钮按下且鼠标仍在按钮上!");
}
if(bm.isPressed()) {
System.out.println("按钮按下且鼠标按键没释放!");
}
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
// System.out.println("鼠标进入按钮区域!");
if(bm.isRollover()) {
System.out.println("鼠标在按钮上!");
}
}
@Override
public 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);
}
}