点击jitem后改变jtable单元格颜色

时间:2013-11-04 17:04:51

标签: java swing jtable tablecellrenderer

我是Java Swing的新手。我有jtable,在第2列,当右键单击一个单元格时,jpopmenu显示有两个选项(正在进行/已解决),我想在单击选项“已解决”时将单元格颜色修改为绿色。我知道我需要一个细胞渲染器。怎么说呢?

我的源代码是:

public class logaff {

static File font_file = new File("font/MYRIADPRO-REGULAR.ttf");
static JPopupMenu pm;
static JMenuItem one = new JMenuItem();
static JMenuItem two = new JMenuItem();
static JTable table;

public static void main(String[] args) throws FontFormatException,
        IOException {
    Font fontt = Font.createFont(Font.TRUETYPE_FONT, font_file);
    Font sizedFont = fontt.deriveFont(Font.PLAIN, 15);
    JPanel logaffich = new JPanel();
    logaffich.setBackground(Color.black);
    logaffich.setLayout(null);

    JPanel tableau = new JPanel();
    tableau.setLocation(5, 15);
    tableau.setSize(790, 520);
    tableau.setBackground(Color.white);

    JButton a = new JButton("fg");
    String[] columnNames = { "ID", "Description", "Status", "Cam",
            "Elapsed Time" };
    String[][] data = new String[10][5];

    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[i].length; j++) {
            data[i][j] = "Table " + i + ", " + j;

        }
    }

    int[] columnsWidth = { 158, 450, 60, 40, 80 };

    table = new JTable(data, columnNames);
    int k = 0;
    for (int width : columnsWidth) {
        TableColumn column = table.getColumnModel().getColumn(k++);
        column.setMinWidth(width);
        column.setMaxWidth(width);
        column.setPreferredWidth(width);
        table.setRowHeight(55);
    }

    JScrollPane scrollPane = new JScrollPane(table);
    table.setFillsViewportHeight(true);
    tableau.setLayout(new BorderLayout());
    tableau.add(scrollPane, BorderLayout.CENTER);

    pm = new JPopupMenu();
    pm.add(one);
    pm.add(two);

    table.addMouseListener(new MouseAdapter() {

        public void mouseReleased(MouseEvent me) {
            try {
                showPopup(me);
            } catch (FontFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

    logaffich.add(tableau);
    TitledBorder title1;

    title1 = BorderFactory.createTitledBorder(null, "New Log Alert",
            TitledBorder.LEFT, TitledBorder.TOP, sizedFont, Color.white);
    logaffich.setBorder(title1);

    // panel pour le formulaire
    JFrame frame = new JFrame();
    frame.setContentPane(logaffich);
    // Create and set up the content pane.
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(808, 565);
    frame.setResizable(false);
    frame.setVisible(true);

}

private static void showPopup(MouseEvent me) throws FontFormatException,
        IOException {
    // is this event a popup trigger?
    if (pm.isPopupTrigger(me)) {
        Point p = me.getPoint();
        final int row = table.rowAtPoint(p);
        final int col = table.columnAtPoint(p);
        // if we've clicked on a row in the second column
        if (row != -1 && col == 1) {
            File font_file = new File("font/MYRIADPRO-REGULAR.ttf");

            Font fontt = Font.createFont(Font.TRUETYPE_FONT,font_file);
            Font sizedFont = fontt.deriveFont(Font.BOLD, 17);
            final ImageIcon progress = new ImageIcon("images/progress.png");
            one.setIcon(progress);
            one.setFont(sizedFont);
            final ImageIcon ok = new ImageIcon("images/ok.png");
            two.setIcon(ok);
            two.setFont(sizedFont);

            one.setText("In progress " + row + ".");
            two.setText("Solved " + row + ".");
            pm.show(table, p.x, p.y);

        }
        one.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent me) {
                System.out.println("sfsdf" + row);

            }

        });
    }
}
 }

1 个答案:

答案 0 :(得分:0)

您需要阅读有关Renderers的文档。为了正确使用它。

下一代码将自定义单元格渲染器添加到您的列:

 TableColumn column = table.getColumnModel().getColumn(1);
 column.setCellRenderer(getRenderer());

getRenderer方法的示例代码:

private static TableCellRenderer getRenderer() {
return new DefaultTableCellRenderer(){
    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
            boolean solved = false;
            if (value.toString().endsWith("Solved")) {
                solved = true;
                value = value.toString().replace("Solved", "");
            }
            Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value,isSelected, hasFocus, row, column);
            if (solved) {
                tableCellRendererComponent.setBackground(Color.GREEN);
            } else {
                tableCellRendererComponent.setBackground(table.getBackground());
            }
            return tableCellRendererComponent;
    }
};
}

该方法返回DefaultTableCellRenderer。在if-else语句中,您可以确定单元格的背景。

编辑: 1)更改了getRenderer方法。

2)以下一种方式创建你的popUp:

 pm = new JPopupMenu();
pm.add(one);
pm.add(two);
one.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent me) {
        if(row != -1)
        System.out.println("sfsdf" + row);

    }

});

two.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent me) {
        if(row != -1){
            Object valueAt = table.getValueAt(row,1);
            table.setValueAt(valueAt+"Solved", row,1);
            ((DefaultTableModel)table.getModel()).fireTableDataChanged();
        }
    }

});

因为每次调用showPopup方法时都会添加监听器,而不是像我的示例那样只需添加一次。 row字段我设置为静态字段。

3)你的方法showPopup发生了变化:

private static void showPopup(MouseEvent me) throws FontFormatException,
    IOException {

// is this event a popup trigger?
if (pm.isPopupTrigger(me)) {
    Point p = me.getPoint();
    row = table.rowAtPoint(p);
    final int col = table.columnAtPoint(p);
    // if we've clicked on a row in the second column
    if (row != -1 && col == 1) {
        final ImageIcon progress = new ImageIcon("images/progress.png");
        one.setIcon(progress);
        final ImageIcon ok = new ImageIcon("images/ok.png");
        two.setIcon(ok);

        one.setText("In progress " + row + ".");
        two.setText("Solved " + row + ".");
        pm.show(table, p.x, p.y);

    } 

}
}

4)下一步创建你的桌子table = new JTable(new DefaultTableModel(data, columnNames));

如果您按照我推荐的方式更改代码,当您在popUp中按已解决时,单元格将为绿色背景。