swing的mvc |
swing |
|
与VCL、AWT等框架中的图形界面框架不同,Swing创造性的采用了MVC(Model View Controller) 模式。MVC 把控件(Component)划分成三个部分:模型( Model):管理这个模块中所用到的数据和值,如某个数据的最大值、最小值、当前值等数据;视图( View):管理如何将模型显示给用户;控制器(Controller) 决定如何处理用户和该模块交互时产生的事件,如用户单击一个按钮等。Sun 出于对视图和控制器之间的依赖关系的考虑, 在 Swing 设计中将 MVC体系简化为分离模型体系 ( Separable Model Architecture) , 将其中的控制器和视图结合成 UI 代理。
界面中的每个控件都包含三种特征:
它的状态:比如一个按钮的状态
它的外观:颜色、尺寸等
它的行为:对事件作出的反应
以一个按钮为例,它有可用、不可用状态,在不同的LookAndFeel中有不同的外观显示,在鼠标按下、鼠标右击等事件中有自己独特的响应方式。如果管理按钮状态、绘制按钮外观,响应时间等任务都由按钮负责的话就违背了面向对象设计中的“单一责任原则”。Swing开发人员采用MVC模式解决了此问题,将控件的LookAndFeel同一个对象关联到一起,同时将其内容保存到另一个对象中。控制器负责控制用户输入事件。比如鼠标单击、按键操作等,它会决定将这些事件转换成模型中的改变.还是视图中的改变。例如,假定用户在文本框中按下某个键,控制器就会调用模型的“插入字符”命令。随后,模型会通知视图更新来显示新的模型。视图不用关心什么时候进行文字改变,只要模型通知它更新它就会更新。这样控制器只用与用户交互并把交互结果反映到模型中去;模型负责维护状态,当状态变化时通知视图更新显示;视图不负责用户交互的状态维护,它只是根据模型中的状态绘制不同的界面。
Swing中的大多数控件的模型是由一个名字以Model结尾的接口实现的。比如按钮对应的模型接口就是 ButtonModel,JDK中定义了ButtonModel的默认实现类DefaultButtonModel。下面是ButtonModel各个方法的说明:
boolean isArmed():如果按钮被按下,且鼠标指针仍停留在按钮上则返回true
boolean isSelected():如果按钮处于选择状态则返回true
boolean isEnabled():如果按钮可用则返回true
boolean isPressed():如果按钮被按下,但鼠标没有松开,则返回true
boolean isRollover():如果鼠标指针在按钮之上则返回true
public int getMnemonic():返回按钮的助记键
public String getActionCommand():返回命令字符串
此外还有对应的设置状态方法:public void setArmed(boolean b)、public void setSelected(boolean b)、public void setEnabled(boolean b)、public void setPressed(boolean b)、public void setRollover(boolean b)、public void setMnemonic(int key)、public void setActionCommand(String s)等。
每一个JButton都保存着一个ButtonModel对象,我们可以通过JButton的getModel方法来取得该模型对象:
JButton btn = new JButton(“test”);
ButtonModel btnModel = btn.getModel();
通过这个模型对象我们就可以得到按钮的是否可用等状态,不过这个模型是给控件开发者使用的,对于普通使用者来说无需直接调用它,JButton提供了方法来间接的取得这些属性,这一点可以从AbstractButton类的isSelected方法中看出来:
public boolean isSelected()
{
return model.isSelected();
}
Swing中大部分控件都由自己的模型,比如JList控件的ListModel、JTable的TableModel、JSpinner的SpinnerModel、JComboBox的SpinnerModel(SpinnerModel是从ListModel派生出来的),这些模型也由默认的实现,名称通常为模型名前加Default。
Swing中的大多数控件的视图是由一个名字以UI结尾的类实现的,比如按钮对应的模型接口就是 ButtonUI。由于视图在不同的LookAndFeel中有不同的展现形式,所以控件的视图对每一种LookAndFeel都提供了不同的实现。以JLabel为例,它就有MetalLabelUI、MotifLabelUI、WindowsLabelUI等对应不同LookAndFeel的实现。所有的视图都要直接或者间接的从ComponentUI抽象类派生,ComponentUI类中的方法都是供Model回调使用的,下面是ComponentUI主要方法的说明:
public void installUI(JComponent c):这个方法在ComponentUI 实例被安装到UI代理的时候被触发,用来根据LookAndFeel配置控件。它需要完成如下工作:为Color、Font、Border、Icon等类型的属性设定默认值;根据需要设置布局管理器;创建子控件;初始化监听器;为控件设置PropertyChangeListener 监听器以检测控件属性变化事件;初始化快捷键、Tab键顺序等;初始化数据;
public void uninstallUI(JComponent c):这个方法在ComponentUI 实例被从UI代理移除的时候触发。需要在此方法中撤销任何在installUI中进行的配置,要保证JComponent实例变为洁净状态(也就是没有监听器,没有LookAndFeel专有属性等)。它需要完成如下工作:从控件中移除border;从控件中移除布局管理器;从控件中移除子控件;从控件中移除事件、属性监听器、从控件中移除快捷键、Tab键顺序等;将数据标记为可以垃圾回收。
public void paint(Graphics g, JComponent c):为本视图的LookAndFeel绘制控件。
public void update(Graphics g, JComponent c):通知UI代理绘制指定控件。当特定的控件被绘制的时候此方法会被触发。这个方法的默认实现是用背景色填充控件,并且立即调用paint方法。
public Dimension getPreferredSize(JComponent c):返回当前LookAndFeel下控件的最佳尺寸。默认实现是返回null;
public Dimension getMinimumSize(JComponent c):返回当前LookAndFeel下控件的最小尺寸。默认实现是返回getPreferredSize的值;
public Dimension getMaximumSize(JComponent c):返回当前LookAndFeel下控件的最大尺寸。默认实现是返回getPreferredSize的值;
public boolean contains(JComponent c, int x, int y):判断指定的x、y坐标是否存在于当前LookAndFeel下的控件中。
public static ComponentUI createUI(JComponent c):为指定的控件返回UI代理实例。如果UI代理子类是无状态的,它也可以返回多控件共享的实例。如果UI代理子类是有状态的,则它必须为某个控件返回一个新的实例。
public int getAccessibleChildrenCount(JComponent c):返回所有可访问子控件的数量。
public Accessible getAccessibleChild(JComponent c, int i):返回指定的子控件
|
网站记录 |
网站 |
|
1、java eclipse android网站 英文 http://www.vogella.de/
2、Web入门者必看的HTML代码编写的30条军规(1) http://developer.51cto.com/art/201201/310974.htm
3、swing变成基础与进阶 http://developer.51cto.com/art/201201/313153.htm
|
swing 启动界面 |
swing |
|
import javax.swing.*;
import java.awt.*;
import java.net.*;
public class JSplashWindow extends JWindow implements Runnable
{
Thread splashThread=null;
public JSplashWindow()
{
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));//设置启动界面的光标样式
JPanel splash=new JPanel(new BorderLayout());
URL url=getClass().getResource("1.jpg");//获得指定资源文件的绝对路径。
if(url!=null)
{
splash.add(new JLabel(new ImageIcon(url)),BorderLayout.CENTER);
}
setContentPane(splash);
Dimension screen=Toolkit.getDefaultToolkit().getScreenSize();//获得屏幕的大小
pack();
setLocation((screen.width-getSize().width)/2,(screen.height-getSize().height)/2);//使启动窗口居中显示
start();
}
public void start()
{
toFront();//window类的toFront()方法可以让启动界面显示的时候暂时在最前面,用window类的setAlwayOnTop(boolean)方法可以让窗口总保持在最前面。
splashThread=new Thread(this);
splashThread.start();
}
public void run()
{
try
{
setVisible(true);
Thread.sleep(50000);
}
catch(Exception e)
{
e.printStackTrace();
}
dispose();
}
static void showFrame(String title)
{
JFrame frame=new JFrame(title);
frame.setSize(400,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screenSize=frame.getToolkit().getScreenSize();//获得屏幕的大小
Dimension frameSize=frame.getSize();
if(frameSize.height>screenSize.height)
{
frameSize.height=screenSize.height;
}
if(frameSize.width>screenSize.width)
{
frameSize.width=screenSize.width;
}
frame.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
frame.setVisible(true);
}
public static void main(String[] args)
{
showFrame("Demo splash window");
JSplashWindow splash=new JSplashWindow();
//splash.start();
}
}
/*getToolkit()方法是java.awt.window类的方法它可以得到一个Toolkit类。Toolkit对象的getScreenSize()方法可以得到屏幕的大小。
getScreenSize()方法返回一个 Dimension对象,它的width,height属性就是屏幕的宽和高。
Object getClass()方法是java.lang.Object类的方法它可以获得当前正在运行类的对象
URL getResource(String name)方法是java.lang.Class类的方法用此方法可以获得一个指定资源文件的绝对路径。*/
|
刷新JList中的一个元素 |
swing |
|
//刷新
Rectangle rect = list.getCellBounds(index, index);
list.repaint(rect);
|
按键绑定事件 |
house源码 |
|
//root面板, 动作, 按键名称, 按键代码,
public static void registerKeyEvent(RootPaneContainer root, Action action, String keyName, int keyCode, int modifiers)
{
if (root == null)
return;
JRootPane rootPane = root.getRootPane();
InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(keyCode, modifiers), keyName);
rootPane.getActionMap().put(keyName, action);
}
KeyStroke,表示按键与组合键的一个类,可获取共享实例
|
修改序列 |
oracle |
|
DROP SEQUENCE seq_role;
create sequence seq_role
minvalue 1
maxvalue 1000000000000000000000000000
start with ?
increment by 1
cache 20;
|
iframe中的页面调用 父窗口中 |
iframe |
|
window.parent.****();
|
bat启动java程序,并关闭dos窗口 |
dos |
|
@echo off
#start eclipse.exe -noexit -clean
start javaw %OPT% be.ibridge.kettle.spoon.Spoon %1 %2 %3 %4 %5 %6 %7 %8 %9
#start eclipse.exe -noexit -console -consoleLog -clean
#rem eclipse.exe -exit -clean
#exit
@echo off并不是DOS程序中的,
而是DOS批处理中的。
当年的DOS,所有操作都用键盘命令来完成,
当你每次都要输入相同的命令时,
可以把这么多命令存为一个批处理,
从此以后,只要运行这个批处理,
就相当于打了几行、几十行命令。
DOS在运行批处理时,
会依次执行批处理中的每条命令,
并且会在显示器上显示,
如果你不想让它们显示,
可以加一个“echo off”
当然,“echo off”也是命令,
它本身也会显示,
如果连这条也不显示,
就在前面加个“@”。
|
html字符的替换 |
js |
|
var test = '({"name":"ss"})';
var json = '({"name":"ss"})';
var newStr = test.replace(/"/g, '"');
alert(newStr);
alert(eval(newStr).name);
|
监听回车事件,触发方法 |
jquery |
|
$(document).ready(function loginEnterCheck(){
$("html").die().live("keydown",function(event){
if(event.keyCode==13){
//调用登陆方法;
loginCheck();
}
});
});
|
java中从反斜杠路径中截取文件名的办法 |
java |
|
例如:获取到的文件路径为C:\Documents and Settings\Leeo\My Documents\logo.gif
现在想要取得图片的名称logo.gif,我们知道反斜杠“\”是转义字符,所以不能直接
String temp[] = filePath.split("\");//filePath的值就是上面的文件路径
来分割文件路径,而应该这样写
/*
*java中\\表示一个\,而regex中\\也表示\,
*所以当\\\\解析成regex的时候为\\
**/
String temp[] = filePath.split("\\\\");
在Linux系统中
System.getProperty("file.separator", "\\")
输出为“/”,而在Windows系统中输出为“\”,所以要兼容两者可以这么写
String temp[] = filePath.replaceAll("\\\\","/").split("/");
获取文件名称的完整代码如下:
String temp[] = filePath.replaceAll("\\\\","/").split("/");
String fileName = ""
if(temp.length > 1){
fileName = temp[temp.length - 1];
}
|
JComboBox添加监听 |
swing |
|
comboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
if (e.getStateChange() == ItemEvent.SELECTED) {
loadModel(comboBox.getSelectedItem().toString());
}
}
});
|
远程调试 |
weblogic |
|
在startweblogic.xml中加入这一句
set JAVA_OPTIONS= -Xdebug -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=7777,suspend=n
然后 %JAVA_HOME%\bin\java %JAVA_VM% 后面加上 %JAVA_DEBUG%
|
同步日志 |
oracle |
|
select distinct a.co_code, a.co_name,a.compo_name, a.compo_id, b.usum, c.rsum
from as_log a,
(select log.co_code,log.compo_id,count(log.user_id) usum from as_log log group by log.co_code, log.compo_id) b ,
(select log.co_code,log.compo_id,count(distinct log.user_id) as rsum from as_log log group by log.co_code,log.compo_id) c
where a.co_code = b.co_code and b.compo_id = a.compo_id and a.co_code = c.co_code and a.compo_id = c.compo_id
|
触发器自增长 |
oracle |
|
--ESB sequence 序列
drop sequence SEQ_ESB_ID;
create sequence SEQ_ESB_ID
minvalue 0
maxvalue 9999999999
start with 1
increment by 1
cache 20
order;
--触发器,自增长
create or replace trigger tri_ESB before insert on DX_ESB for each row
begin
select SEQ_ESB_ID.Nextval into :new.id from dual;
end;
|
导库 |
oracle |
|
--导入导出语句
exp username/passed@sid file=expfile.dmp
imp username/passed@sid file=expfile.dmp full=y
--创建临时表空间
CREATE TEMPORARY TABLESPACE gmap60_temp
TEMPFILE 'D:\app\oradata\orcl\gmap60_temp.dbf'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE unlimited;
--创建表空间
CREATE TABLESPACE gmap60
LOGGING
DATAFILE 'D:\app\oradata\orcl\gmap60.DBF'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE unlimited;
--创建用户
create USER gmap60 IDENTIFIED BY "1"
DEFAULT TABLESPACE gmap60
TEMPORARY TABLESPACE gmap60_temp;
--给用户分配权限
grant connect,dba,resource to gmap60;
--删除表空间
DROP TABLESPACE YN_DATA INCLUDING CONTENTS AND DATAFILES
--修改密码
alter user xxxx identified by
|
同义词 |
oracle |
|
select * from demo.tax_user_salary@DBLINK_UFGOVTAX2
drop SYNONYM hr_user;
CREATE SYNONYM hr_education FOR demo.hr_education@DBLINK_UFGOVTAX2
drop SYNONYM tax_user_salary;
select * from hr_education
|
oracle instr |
oracle |
|
语法如下:instr( string1, string2 [, start_position [, nth_appearance ] ] )
string1 源字符串,要在此字符串中查找。
string2 要在string1中查找的字符串.
start_position 代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
nth_appearance 代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
注意:
如果String2在String1中没有找到,instr函数返回0.
|
oracle drop表 ,恢复 |
oracle |
|
flashback table hr_user to before drop
|
eclipse块选择模式快捷键 |
快捷键 |
|
alt+shift + a
|
查询一个表,或视图中字段的多少 |
oracle |
|
select count(*) from all_tab_columns where table_name = 'V_TAX_USER_KZXX'
|
swing 打开网页 |
swing |
|
1、通过命令打开
Runtime run = Runtime.getRuntime();
try {
String url = "rundll32 url.dll,FileProtocolHandler url"
run.exec(url);
} catch (Exception ex) {
ex.printStackTrace();
}
2、Desktop desk = Desktop.getDesktop();
try {
desk.browse(new URL(url).toURI());
} catch (Exception e1) {
e1.printStackTrace();
}
|
JFileChooser |
swing |
|
JFileChooser filechooser = new JFileChooser();//创建文件选择器
filechooser.setCurrentDirectory(new File("."));//设置当前目录
filechooser.setAcceptAllFileFilterUsed(false);
//filechooser.setFileSelectionMode(JFileChooser.SAVE_DIALOG);
//显示JAVA源文件
filechooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
public boolean accept(File f) { //设定可用的文件的后缀名
if(f.getName().endsWith(".xls")||f.isDirectory()){
return true;
}
return false;
}
public String getDescription() {
return "excel(*.xls)";
}
});
int returnVal = filechooser.showSaveDialog(new JFrame());
if(returnVal==JFileChooser.APPROVE_OPTION){
String savefilePath = null;
if(filechooser.getSelectedFile().getAbsolutePath().endsWith(".xls")){
savefilePath = filechooser.getSelectedFile().getAbsolutePath();
}else{
savefilePath = filechooser.getSelectedFile().getAbsolutePath() + ".xls";
}
jtable.export2Excel(savefilePath, null, null,
new ColumnFilter() {
public boolean accept(int columIndex, JGroupableTable table) {
return true;
}
});
JOptionPane.showMessageDialog(null, "保存成功","提示",JOptionPane.INFORMATION_MESSAGE);
|
sqlmap中不能有分号 |
sqlmap |
|
sqlmap中不能有分号
|
将一个文件夹中的所有文件名导入到一个txt文件中 |
dos |
|
dir c:\my /b >>c:\my.txt
|
通过webstart向高速缓存导入jar包 |
jar, 缓存,webstart |
|
1、命令为:
javaws -import http://127.0.0.1:7001/download/jnlp/installJars.jnlp -silent
2.jnlp格式为
<?xml version='1.0' encoding='UTF-8'?>
<jnlp codebase='http://10.11.114.70:7001/'>
<information>
<title>ClientSet</title>
<vendor>UFGOV</vendor>
<description>get init jars</description>
<offline-allowed/>
</information>
<resources>
<jar href='./applets/plugins/com.ufgov.gmap.spi_1.0.0.jar' />
<jar href='./applets/plugins/com.ufgov.admin.spi_1.0.0.jar' />
</resources>
<applet-desc
name='ClientSet'
main-class='com.ufgov.clientsetting.component.JApplet'
width='527'
height='428'>
</applet-desc>
<security>
<all-permissions/>
</security>
</jnlp>
|
给java客户端导入证书 |
数字证书 |
|
1、 keytool -export -alias ufgov -keystore ufgov.jks -file ~/test.csr -storepass 111111
导出证书,csr类型的 ,验证csr好使,crt的不知道为什么不好使;
2、keytool -import -alias MyAlias -file c:\my_cert.csr -keystore "C:\Documents and Settings\myuserid\Application Data\Sun\Java\Deployment\security\trusted.certs" -storepass "" -noprompt
-file后面为我们导出的证书,这里要导入
-keystore后面为要导入到的证书库
-storepass "" 后面为空即可
-noprompt 表示不用提示是否选项
3、执行bat文件出现停止不动现象,解决办法
br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String errorMsg = null;
while((errorMsg = br.readLine()) != null){
System.out.println(errorMsg);
}
将process中的信息导引出来 ,估计是本身的存储太小,需要输出到一个地方
4、证书库地址 "%USERPROFILE%\Application Data\Sun\Java\Deployment\security\trusted.certs"
win7 和 XP的不同
|
查看缓存的时候用到的 |
dos |
|
dir /s /b
|
操作系统分隔符,用来处理不同的操作符问题 |
java |
|
System.getProperty("file.separator")
File.separator
|
按钮背景设置透明 |
html |
|
<input type = "button" value = "Button" style = "background-color: transparent; border: 0;" >
< input id = "Button1" type = "button" value = "button" style = " FILTER: alpha(opacity=30);" />
< input id = "Button1" type = "button" value = "button" style = "opacity:0.3;" />
< input id = "Button1" type = "button" value = "button" style = "-moz-opacity:0.3;" />
|