日期:2014-05-20  浏览次数:20611 次

JTable单元格编辑问题
如下代码所示,我在表格中的一个单元格中添加了一个面板,上面有一个按钮添加了监听事件。但现在鼠标点击上面的按钮时没反应,好像是鼠标无法获取面板中的组件。不知道怎么解决,恳求各位高手指点一下,不胜感激。
代码如下:
Java code

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableDemo extends JFrame {
    private String[] columnNames = {"姓  名", "操作"};//记录表格的列名
    JTable table;
    public TableDemo() {
        Container cp = this.getContentPane();
        JPanel panel = new JPanel();
        table = this.createJTable(columnNames);
        table.getColumnModel().getColumn(1).setCellRenderer(new PanelTableCellRender());//让第二列显示一个特定的面板
        DefaultTableModel model = (DefaultTableModel) this.table.getModel();
        model.addRow(new Object[] {"Zidane", new PanelDemo()});
        model.addRow(new Object[] {"Henry", new PanelDemo()});
        JScrollPane scrollPane = new JScrollPane(table);
        
        panel.setSize(300, 200);
        panel.add(scrollPane);
        cp.add(panel);
        setVisible(true);
        setBounds(300, 200, 500, 300);
    }
    /**
     * 新建一个JTable对象
     * @param list
     * @param columnNames
     * @return
     */
    public JTable createJTable(String columnNames[]) {
        DefaultTableModel model = new DefaultTableModel();
        for(int i = 0; i < columnNames.length; i++) {
            model.addColumn(columnNames[i]);
        }
        JTable temporaryTable = new JTable(model);
        temporaryTable.setFont(new Font("微软雅黑", Font.ROMAN_BASELINE, 23));
        temporaryTable.getTableHeader().setBackground(Color.MAGENTA);
        temporaryTable.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 20));
        temporaryTable.setRowHeight(75);
        return temporaryTable;
    }
    /**
     * 该类实现了表格中“操作”那一列单元格的绘制
     * @author lxb 2011-08-24
     */
    class PanelTableCellRender extends PanelDemo implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            if (hasFocus) 
                 setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
              else
                 setBorder(null);
            return this;
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        TableDemo demo = new TableDemo();
    }
}



Java code

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PanelDemo extends JPanel implements ActionListener {
    JButton button;
    JLabel viewLabel;
    public PanelDemo() {
        button = new JButton("编辑");
        button.setFont(new Font("微软雅黑", Font.CENTER_BASELINE, 18));
        button.addActionListener(this);
        viewLabel = new JLabel();
        viewLabel.setFont(new Font("微软雅黑", Font.CENTER_BASELINE, 18));
        viewLabel.setSize(80, 40);
        
        this.add(button);
        this.add(viewLabel);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button) {
            button.setBackground(Color.magenta);
            viewLabel.setText("编辑!");
        }
    }

}




------解决方案--------------------
用的字体是微软雅黑的,这个跨平台使用可能会有影响的
------解决方案--------------------
Swing很久没用了,帮顶一个
------解决方案--------------------
学习下哈