SWing窗体,在Java中也算是一个不错的东西吧。只不过跟.NET相比,虽然稍微炫丽了一点,但是好像它的样式可定制性并不强,更不可能跟Web相比。我曾经稍微了解下SWing 的皮肤设置,好像很麻烦,成本比较大。这里仅列出些比较实用的好用的方法吧。
首先,我们看下有关JFrame的一些常用特性。
这里有窗口图标的设置,将窗体定义在屏幕的中心,设置默认退出,以及透明度渐变等等。看代码:
public JFrame getLoginframe() {
if(loginframe ==null){
loginframe =new JFrame("Login");
//定义窗口图标
loginframe.setIconImage(Toolkit.getDefaultToolkit().getImage("source/icon/fire.png"));
//定义窗体大小
loginframe.setSize(450, 350);
//得到屏幕大小
Dimension ds = Toolkit.getDefaultToolkit().getScreenSize();
//定义窗口位置(屏幕中心)
loginframe.setLocation((int)(ds.getWidth()-loginframe.getWidth())/2, (int)(ds.getHeight()-loginframe.getHeight())/2);
//调用添加组件方法(该方法自定义的)
getContents(loginframe);
//初始透明度为全透明
com.sun.awt.AWTUtilities.setWindowOpacity(loginframe,0f);
//设置默认关闭操作时退出
loginframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置可见性
loginframe.setVisible(true);
//让窗体慢慢显示
for (int i=0; i<30; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
com.sun.awt.AWTUtilities.setWindowOpacity(loginframe, i/30.0f);//透明度渐变
loginframe.repaint();
}
}
return loginframe;
}
接下来,就是一些JTable方面的方法了,因为目前来说很多人对JTable的应用还是不太熟练。
这里涉及的有JTable选中行,选中列的设置,以及选中行时候触发的事件
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 只能单行选择
table.setColumnSelectionAllowed(false);// 不能选中单元格
table.setCellSelectionEnabled(false);//单元格不可编辑
table.setRowSelectionAllowed(true);//允许选中行
ListSelectionModel selection =table.getSelectionModel();
selection.addListSelectionListener(new ListSelectionListener() {
@Override
publicvoid valueChanged(ListSelectionEvent e) {
if (evt.getValueIsAdjusting()) {//如果没有这个判断,下面代码会执行两次
int[] click = table.getSelectedRows();//得到选中行
for (int i : click) {//操作处理
int clumn = table.convertColumnIndexToView(0);
Object clickValue = table.getValueAt(i, clumn);
if (clickValue != null) {
table.setValueAt(null, i, clumn);
} else {
table.setValueAt(true, i, clumn);
}
}
}
}
});
还有个比较常用的功能就是隐藏列,我在网上经常看到有人隐藏列的时候使用TableColumnModel的removeColumn()方法,此方法不是隐藏列,而是直接把此列从JTable中移除了。下面是正式的在JTable中隐藏一列:
privatevoid hideClumn(int columnIndex) {// 传入要隐藏的列的索引,从0开始
TableColumnModel tcm =table.getColumnModel();
tcm.getColumn(columnIndex).setMaxWidth(0);
tcm.getColumn(columnIndex).setMinWidth(0);
table.getTableHeader().getColumnModel().getColumn(columnIndex).setMaxWidth(0);// 隐藏猎头
}
至于其它设置JTable的行/列背景色前景色,包括选中行/列的背景色前景色,这里就不再详说了,可以参考API文档。
还有一个比较常见的问题就是给JLabel设置背景色。
在JLabel对象中,有设置背景颜色的方法setBackground(Color color),但是用过的人会发现,仅此这样使用的话,JLabel是无法显示背景色的。因为,JLabel默认是全透明的,只能显示其容器的背景色,需要设置其透明度setOpaque(true)以后,对Background的设置才会有效。
JPanel weeks=new JPanel(); weeks.setLayout(new GridLayout(0,7,0,0)); weeks.setSize(elementWidth*7, elementHeight); weeks.setLocation(0, elementHeight); String[] WEEKS = {"日","一","二","三","四","五","六"}; for (int i=0;i<WEEKS.length;i++) { JLabel temWeek=new JLabel(WEEKS[i],JLabel.CENTER);//显示内容,且居中显示 temWeek.setOpaque(true);//透明度设置为true temWeek.setBackground(Color.GREEN);//背景色设置 weeks.add(temWeek); }
效果: