带有按钮 setCellRenderer() 的可执行 Jar 不起作用

Posted

技术标签:

【中文标题】带有按钮 setCellRenderer() 的可执行 Jar 不起作用【英文标题】:Executable Jar With Button setCellRenderer() not Working 【发布时间】:2014-06-29 20:27:23 【问题描述】:

我有一个严重的问题。 我正在使用 Jtable,其中我使用此代码添加了一个按钮。

    TableColumn buttonColumn = tableSupplier.getColumnModel().getColumn(8);
    TableButton buttons = new TableButton();
    buttons.addHandler(new TableButton.TableButtonPressedHandler() 
        public void onButtonPress(int row, int column) 
            try 
                saveImageInFolder();
             catch (IOException e) 
                // TODO Auto-generated catch block
                Utility.getFormFieldValidator().showErrorMessage();
            
        
    );

    buttonColumn.setCellRenderer(buttons);
    buttonColumn.setCellEditor(buttons);

我的按钮类代码是这样的。

package org.chillies.validator;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import javax.swing.AbstractCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import org.chillies.view.SupplierList;

public class TableButton extends AbstractCellEditor implements TableCellEditor,TableCellRenderer

private static final long serialVersionUID = 5647725208335645741L;

public interface TableButtonPressedHandler
    
    /**
     * Called when the button is pressed.
     * @param row The row in which the button is in the table.
     * @param column The column the button is in in the table.
     */
    void onButtonPress(int row, int column);


private List<TableButtonPressedHandler> handlers;
private Hashtable<Integer, JButton> buttons;

public TableButton()

    handlers = new ArrayList<TableButtonPressedHandler>();
    buttons = new Hashtable<Integer, JButton>();


/**
 * Add a slide callback handler
 * @param handler
 */
public void addHandler(TableButtonPressedHandler handler)

    if (handlers != null)
    
        handlers.add(handler);
    


/**
 * Remove a slide callback handler
 * @param handler
 */
public void removeHandler(TableButtonPressedHandler handler)

    if (handlers != null)
    
        handlers.remove(handler);
    



/**
 * Removes the component at that row index
 * @param row The row index which was just removed
 */
public void removeRow(int row)

    if(buttons.containsKey(row))
    
        buttons.remove(row);
    


/**
 * Moves the component at oldRow index to newRow index
 * @param oldRow The old row index
 * @param newRow THe new row index
 */
public void moveRow(int oldRow, int newRow)

    if(buttons.containsKey(oldRow))
    
        JButton button = buttons.remove(oldRow);
        buttons.put(newRow, button);
    


public Component getTableCellRendererComponent(JTable table, Object value, boolean selected, boolean focus, final int row, final int column)

    JButton button = null;
    if(buttons.containsKey(row))
    
        button = buttons.get(row);
    
    else
    
        button = new JButton();
        if(value != null && value instanceof String)
        
            button.setText((String)value);
        
        button.addActionListener(new ActionListener()
        
            public void actionPerformed(ActionEvent e)
            
                if(handlers != null)
                
                    for(TableButtonPressedHandler handler : handlers)
                    
                        handler.onButtonPress(row, column);
                    
                
            
        );

        button.setBorder(null);
        button.setIcon(new ImageIcon(new ImageIcon(SupplierList.class
                .getResource("/org/chillies/resource/Add.png")).getImage()
                .getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));

        buttons.put(row, button);
    

    return button;


public Component getTableCellEditorComponent(JTable table, Object value, boolean selected, int row, int column)

    JButton button = null;
    if(buttons.containsKey(row))
    
        button = buttons.get(row);
    
    else
    
        button = new JButton();
        if(value != null && value instanceof String)
        
            button.setText((String)value);
        

        buttons.put(row, button);
    

    return button;


public void setButtonText(int row, String text)

    JButton button = null;
    if(buttons.containsKey(row))
    
        button = buttons.get(row);
        button.setText(text);
    


public Object getCellEditorValue()

    return null;


public void dispose()

    if (handlers != null)
    
        handlers.clear();
    


但是当我将我的项目导出到 jar 文件时,这行代码似乎有问题

 buttonColumn.setCellRenderer(buttons);

当我删除这一行并运行 Jar 文件时,项目运行良好,但是当我添加这一行时,它甚至不加载页面。

代码在 Eclipse 中运行良好。

我正在加载我的静态视图类(只是额外的信息)。 感谢您的宝贵时间。

【问题讨论】:

>>“这行代码似乎有问题”你有堆栈跟踪吗?,你指的确切问题是什么? 这是问题兄弟,没有 strack 跟踪,但我删除这行代码工作正常 【参考方案1】:

您似乎错过了 JTable 设计的要点 - 用于整个表的单个渲染器/编辑器(我的意思是所有行):

您只有一个渲染器组件实例,例如 JButton JTable 为每一行调用 getTableCellRendererComponent 您在 getTableCellRendererComponent 中设置渲染器组件上的数据(也就是准备在特定单元格中渲染它)。

不需要地图(哈希表)。

这同样适用于渲染器和编辑器。如果您想知道按下按钮的行,只需调用 jTable.getSelectedRow()。

不需要自定义 TableButtonPressedHandler。

【讨论】:

【参考方案2】:

我得到了我的问题的答案,我修改了 TableButton.java 文件的一些代码。在做了一些快速修复后,我解决了我的问题。

【讨论】:

以上是关于带有按钮 setCellRenderer() 的可执行 Jar 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有按钮的可滚动菜单部分

如何创建 HTML / CSS 代码,以允许带有按钮的可滚动侧边栏更改旁边播放器中的视频源?

带有角色按钮的锚链接内图像的可访问性:可点击元素必须是可聚焦的并且应该具有交互式语义

带有核心数据的可编辑表格视图

如何在按钮中创建简单的可绘制图层

Android - 带有动画的可扩展 TextView