请教一个Java的Swing技术问题.

Swing_ComeOnComeon 2014-07-19 08:36:50
高手,我弄了一个Java的Swin类型,源代码如下:

import java.awt.Component;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

public class TableCellRenderer8 extends JPanel implements ItemListener,
ActionListener {
public TableCellRenderer8() {
jb.addActionListener(this);
}

StringBuffer choice;
JButton jb = new JButton();
JFrame jf = new JFrame("使用单元格绘制器");
JTable table;
// 定义二维数组作为表格数据
Object[][] tableData = {};

public static HashMap<String, Object[]> tableList = new HashMap<String, Object[]>() {
/**
*
*/
private static final long serialVersionUID = 1L;

{
for (int i = 0; i < 100; i++) {
put(String.valueOf(i), new Object[] { "王二小" + i, 29,
new ImageIcon("icon/male.png"),
new ImageIcon("icon/3.gif"), true });

}
}
};

public void addData2table(String username, String place, Integer sex,
boolean isFull) {
ImageIcon sexicon = new ImageIcon("icon/male.png");
if (sex == 0) {// 女
sexicon = new ImageIcon("icon/female.png");
}
Object[] row = new Object[] { username, place, sexicon, new TimeLabel(),
isFull };
// tableList.put(DRecv.BJMemUID[myuserIndex],list);
((DefaultTableModel) table.getModel()).insertRow(0, row);// 加入空行
this.FitTableColumns(this.table);
}

public void removedata2table(List<Object[]> list) {
int i = 0;

// for(int j = 0;j<tableList.size();i++){
// if(tableList.get(i).
//
//
}

public Object[][] toArray(Map<String, Object[]> map) {
Object[][] objs = null;
if (map == null || map.isEmpty()) {
return objs;
}
Object[] o = map.keySet().toArray();
objs = new Object[o.length][];
for (int i = 0; i < o.length; i++) {
objs[i] = map.get(o[i]);
}
return objs;
}

// public void addData2table(Object[][] str){
// tableData[][tableData.length] = str[][tableData.length];
// }
//
// 定义一维数据作为列标题
String[] columnTitle0 = {" 员工姓名 " , " 员工毕业院校 " , " 员工性别 " , " 员工本单维护时间 " , "订单状态"};

public void init() {
// 以二维数组和一维数组来创建一个ExtendedTableModel对象
ExtendedTableModel8 model = new ExtendedTableModel8(columnTitle0, null);
// 以ExtendedTableModel来创建JTable
table = new JTable(model);
table.setRowSelectionAllowed(false);
table.setRowHeight(40);
// 获取第三列
// table.setDefaultRenderer(Object.class, new
// GenderTableCellRenderer());
// table.getColumnModel().getColumn(4)
// .setCellEditor(new DefaultCellEditor(new JCheckBox()));
table.getColumnModel().getColumn(2)
.setCellRenderer(new GenderTableCellRenderer8());

table.getColumnModel().getColumn(3)
.setCellRenderer(new GenderTableCellRenderer8());
// 将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来
jf.add(new JScrollPane(table));
FitTableColumns(table);
jf.setBounds(new Rectangle(100, 100, 800, 600));
// jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
table.updateUI();
}
});
timer.start();
}

public void FitTableColumns(JTable myTable) {
JTableHeader header = myTable.getTableHeader();
int rowCount = myTable.getRowCount();
Enumeration columns = myTable.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn column = (TableColumn) columns.nextElement();
int col = header.getColumnModel().getColumnIndex(
column.getIdentifier());
// 取得表头宽度,然后和内容宽度进行逐一比较,取最大者,如果不想表格宽度随表头变化的话就将下面的width设为0
int width = (int) myTable
.getTableHeader()
.getDefaultRenderer()
.getTableCellRendererComponent(myTable,
column.getIdentifier(), false, false, -1, col)
.getPreferredSize().getWidth();
for (int row = 0; row < rowCount; row++) {
int preferedWidth = (int) myTable
.getCellRenderer(row, col)
.getTableCellRendererComponent(myTable,
myTable.getValueAt(row, col), false, false,
row, col).getPreferredSize().getWidth();
width = Math.max(width, preferedWidth);
}
header.setResizingColumn(column); // 此行很重要
column.setWidth(width + myTable.getIntercellSpacing().width);
}
}



public static void main(String[] args) {
TableCellRenderer8 re8 = new TableCellRenderer8();
re8.init();
for(int I =0;I<20;I++){
re8.addData2table("CJCO"+I, "3", 0, false);
}

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
re8.addData2table("CJCO!!!!","北京邮电大学",0,true);
}

// @Override
// public void itemStateChanged(ItemEvent e) {
// // TODO Auto-generated method stub
// //获取改变的复选按键
// Object source = e.getItemSelectable();
// int index = -1;
// char c = '-';
// if (source==chin) {
// index = 0;
// c = 'c';
// } else if(source == glass){
// index = 1;
// c = 'g';
// }else if(source == hire){
// index = 2;
// c = 'h';
// }else if(source == teeth)
// {
// index = 3;
// c = 't';
// }
//
// //判断改变的按键的改变后的状态
// if(e.getStateChange() == ItemEvent.DESELECTED)
// c = '-';
//
//
// choice.setCharAt(index, c);
//
// upDatePicture();
// }

public static void createAndShowGUI() {
JFrame frame = new JFrame("复选框测试");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JComponent panel = new TableCellRenderer8();

frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

}

private ImageIcon createImageIcon(String string) {
URL url = TableCellRenderer8.class.getResource(string);
if (url != null)
return new ImageIcon(url);
else
System.out.println("image " + string + "not exist!");
return null;
}

private void upDatePicture() {
ImageIcon ii = createImageIcon(File.separator + "images"
+ File.separator + "geek" + File.separator + "geek-"
+ choice.toString() + ".gif");
}

@Override
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub

}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}
}

class ExtendedTableModel8 extends DefaultTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;

// 重新提供一个构造器,该构造器的实现委托给DefaultTableModel父类
public ExtendedTableModel8(String[] columnNames, Object[][] cells) {
super(cells, columnNames);
}

// // 重写getColumnClass方法,根据每列的第一个值来返回其真实的数据类型
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}

class GenderTableCellRenderer8 extends DefaultTableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
private String cellValue;
// 定义图标的宽度和高度
final int ICON_WIDTH = 23;
final int ICON_HEIGHT = 21;

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Icon) {
this.setIcon((Icon) value);
} else if (value instanceof String) {
this.setText((String) value);
} else if (value instanceof TimeLabel) {
return (Component) value;
}
// 设置选中状态下绘制边框
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
} else {
setBorder(null);
}
return this;
}

// // 重写paint方法,负责绘制该单元格内容
// public void paint(Graphics g) {
// // 如果表格值为"男"或"male",则绘制一个男性图标
// if (cellValue.equalsIgnoreCase("男")
// || cellValue.equalsIgnoreCase("male")) {
// drawImage(g, new ImageIcon("icon/male.gif").getImage());
// }
// // 如果表格值为"女"或"female",则绘制一个女性图标
// if (cellValue.equalsIgnoreCase("女")
// || cellValue.equalsIgnoreCase("female")) {
// drawImage(g, new ImageIcon("icon/female.gif").getImage());
// }
// }

// 绘制图标的方法
// private void drawImage(Graphics g, Image image) {
// g.drawImage(image, (getWidth() - ICON_WIDTH) / 2,
// (getHeight() - ICON_HEIGHT) / 2, null);
// }

}

上述代码运行结果如下:

我希望能够把上面的运行效果中的第3列”员工性别“和第4列”员工本单维护时间“之间,添加一个”员工擅长方向“的JTable列。
  并且,能够让小弟的可以在本列位置添加一个String类型的数据,让用户能够得到”自己的员工擅长方向“的总览管理。
希望高手能够指教:
上面的需求,小弟的代码要怎么修改,能够完成客户的要求?
谢谢伟大的Swing,伟大的高手,伟大的CSDN,伟大的CSDN共享精神!!
...全文
1741 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
在itemStateChanged函数里做

public void itemStateChanged(ItemEvent e) {
       JCheckBox box = (JCheckBox) e.getItemSelectable();
       if (box.isSelected())
        //这里是选中事件,在这里处理。
    }
回复
高手,小弟已经把上面的问题解决。 现在小弟遇到的困难是: 怎么做,能够把上面的代码,做出”JCheckBox在被用户点击的时候“,能够捕捉这个动作? 上面的代码,小弟看了好久,不知道其中的”运行效果的JCheckBox“的效果,是怎么跑出来的. 希望高手能够指导: 全类型唯一的一个“位于第111行”的new JCheckBox()的创建JCheckBox实例的语句,为什么被注释掉了,还能够让JCheckBox的运行效果显示出来? 小弟要进行对应的“JCheckBox的监视器“的添加,好让小弟的程序,能够面对用户的”复选框点击“实现”写好的代码的执行“.
回复
相关推荐
发帖
Java SE
创建于2007-09-28

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2014-07-19 08:36
社区公告
暂无公告