在上面的代码中,我打算在JTable初始化的过程中,调用typeTable.getColumnModel().getColumn(0).setPreferredWidth(10);初始化各列的宽度。
而在我的这个样例程序中,JFrame 宽度为600,远远大于JTable 的宽度。因此程序按照我的初始值绘制完JTable之后,会自动的根据JFrame 的大小及布局再重新调整。这样就造成与代码不符的情况。
此帖讨论NetBeans的非默认样式的用法,基于命令行。
这里笔者将“laf(Look And Feel)”译为“样式”
因为NetBeans是基于Swing的,这使得NetBeans具有了百变面孔,相当可爱哟!
了解
Java Swing 的人可能知道Swing 的Look and Feel 是很灵活的,现在就有很多的实现。下面是笔者知道的windows平台的一些列表:
其中前四种是jdk自带的,后三种比较有趣。(因为笔者还没有申请到opensolaris,只知道windows,渴望中)。
注意今天的实现方式是跨平台的。
打开这个路径C:\Program Files\netbeans-5.5\bin,检查是否有nb.exe
打开命令行输入cd "C:\Program Files\netbeans-5.5\bin"回车
输入nb --laf javax.swing.plaf.metal.MetalLookAndFeel
这样NetBeans就打开了,其样式与原来的有什么不同?下面是笔者的图片
命令行:
NetBeans:
用这种方法可以顺利的看到前四种的结果,其中第3种是windows下NetBeans默认的样式。
而对于其它三种则没有效果,因为根本就没有找到那些类。
输出窗口报错如下:
UI class not found, using default UI...
现在介绍其它三种效果的实现方法。
首先,需要获得它们的jar包,你可能已发现我在上面给这三种样式加了链接,点进去下载吧
下面以substance为例,这儿下它的包
https://substance.dev.java.net/files/documents/3294/55844/substance.jar
放到D:\下
打开命令行输入cd "C:\Program Files\netbeans-5.5\bin"回车
输入nb --cp:a "D:\substance.jar" --laf org.jvnet.substance.SubstanceLookAndFeel
这样NetBeans就打开了,其样式与原来的有什么不同?下面是笔者的图片
---------------------------------------------------------------------------------------------------------------------------------------------------------------
每次都在命令行中启动,过于繁琐。可以在NETBEAN 的配置文件中加入配置参数:
1)下载 look and feel jar 包到硬盘上
2)打开netbean安装路径下的etc\netbeans.conf
增加下面一下行:
netbeans_default_options="--cp:p C:\javaplugin\PgsLookAndFeel.jar --laf com.pagosoft.plaf.PgsLookAndFeel"
--cp:p C:\javaplugin\PgsLookAndFeel.jar 作用是把look and feel jar 加到Netbean启动路径上;
--laf com.pagosoft.plaf.PgsLookAndFeel 作用为启用指定的look and feel。
简单来说:
TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。
TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。
以下是在cell中嵌入start、stop两个按钮的表格,注意这里的renderer只是用来显示效果,并没有进行交互动作,真正进行动作的是当你将鼠标点击在cell上时,JTable定位上去的editor,所以不要徒劳在renderer上做点击事项处理,renderer是不会接受到交互事项的,renderer只是个画笔,你看到的start、stop按钮只是这个画笔画出来的内容,是虚的并没有真正的组件在上面。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableTest1 extends JFrame {
JTable table;
String[] states = new String[]{"stop", "stop", "stop"};
// model
class TableModel extends AbstractTableModel{
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return states.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
if(columnIndex == 0){
return states[rowIndex];
}
return null;
}
public String getColumnName(int columnIndex) {
if(columnIndex == 0){
return "state";
}else{
return "operate";
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
if(columnIndex == 0){
return false;
}else{
return true;
}
}
}
// cell editor
class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
int row;
JTable table;
JPanel panel;
JButton start;
JButton stop;
Editor(){
panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
start = new JButton("start");
stop = new JButton("stop");
start.addActionListener(this);
stop.addActionListener(this);
panel.add(start);
panel.add(stop);
}
public Object getCellEditorValue() {
return null;
}
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
this.table = table;
this.row = row;
return panel;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start){
states[row] = "start";
}else{
states[row] = "stop";
}
((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
}
}
// cell render
class Renderer extends JComponent implements TableCellRenderer{
JPanel panel;
JButton start;
JButton stop;
Renderer(){
panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
start = new JButton("start");
stop = new JButton("stop");
panel.add(start);
panel.add(stop);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
return panel;
}
}
public TableTest1(){
super("renderer and editor self-existent");
table = new JTable(new TableModel());
TableColumn tableColumn = table.getColumnModel().getColumn(1);
tableColumn.setCellRenderer(new Renderer());
tableColumn.setCellEditor(new Editor());
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
this.setSize(500, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TableTest1().show();
}
}