按下按钮后,JTable失去焦点

时间:2014-04-16 14:06:59

标签: java swing jtable

我有一个带有自定义编辑器和渲染器的jtable应用于列以将列的内容转换为Button,但是当我按下任何按钮时,表失去焦点,并且唯一的交互式对象在面板中是刚刚点击的按钮,可以反复点击。

这是按钮渲染器代码:

public class ButtonRenderer implements TableCellRenderer {

    private Border dsd_originalBorder;
    private int in_mnemonic;
    private Border dsd_focusBorder;

    private JButton dsd_renderButton;

    /**
     * empty constructor
     */
    public ButtonRenderer() {
        dsd_renderButton = new JButton();
    }

    public Component getTableCellRendererComponent(JTable dsd_table, Object dsd_value,
            boolean bo_isSelected, boolean bo_hasFocus, int in_row, int in_column) {

        if (!WorkplaceConstants.STR_INACTIVE.equals(dsd_table.getValueAt(in_row, dsd_table
                .getColumn(Main.hm_language.get(Language.STATUS))
                .getModelIndex())))
            return new JLabel("");

        if (bo_isSelected) {
            dsd_renderButton.setForeground(dsd_table.getSelectionForeground());
            dsd_renderButton.setBackground(dsd_table.getSelectionBackground());
        } else {
            dsd_renderButton.setForeground(dsd_table.getForeground());
            dsd_renderButton.setBackground(UIManager.getColor("Button.background"));
        }

        if (bo_hasFocus) {
            dsd_renderButton.setBorder(dsd_focusBorder);
        } else {
            dsd_renderButton.setBorder(dsd_originalBorder);
        }

        // renderButton.setText( (value == null) ? "" : value.toString() );
        if (dsd_value == null) {
            dsd_renderButton.setText("");
            dsd_renderButton.setIcon(null);
        } else if (dsd_value instanceof Icon) {
            dsd_renderButton.setText("");
            dsd_renderButton.setIcon((Icon) dsd_value);
        } else {
            dsd_renderButton.setText(dsd_value.toString());
            dsd_renderButton.setIcon(null);
        }
        return dsd_renderButton;

    }

    /**
     * returns the mnemonic to activate the button when the cell has focus
     * 
     * @return the mnemonic
     */
    public int m_getMnemonic() {
        return in_mnemonic;
    }

    /**
     * The mnemonic to activate the button when the cell has focus
     * 
     * @param p_in_mnemonic
     *            the mnemonic
     */
    public void m_setMnemonic(int p_in_mnemonic) {
        this.in_mnemonic = p_in_mnemonic;
        dsd_renderButton.setMnemonic(p_in_mnemonic);
    }

    /**
     * Get foreground color of the button when the cell has focus
     * 
     * @return the foreground color
     */
    public Border m_getFocusBorder() {
        return dsd_focusBorder;
    }

    /**
     * The foreground color of the button when the cell has focus
     * 
     * @param dsd_focusBorder
     *            the foreground color
     */
    public void m_setFocusBorder(Border dsd_focusBorder) {
        this.dsd_focusBorder = dsd_focusBorder;
    }

这是按钮编辑器代码:

public class ButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener, MouseListener{

    private JTable dsd_table;
    private int in_mnemonic;
    private Border dsd_originalBorder;
    private Border dsd_focusBorder;

    private JButton dsd_editButton;
    private Object dsd_editorValue;
    private boolean bo_isButtonColumnEditor;


    /**
     * Constructor 
     * @param dsdp_table the table to which the editor is going to be applied.
     * @param action the action which is to be executed when the button is clicked
     */
    public ButtonEditor(JTable dsdp_table) {
        this.dsd_table = dsdp_table;
        dsd_editButton = new JButton();
        dsd_editButton.setFocusPainted( false );
        dsd_editButton.addActionListener( this );
        dsd_originalBorder = dsd_editButton.getBorder();
        m_setFocusBorder( new LineBorder(Color.BLUE) );

        dsdp_table.addMouseListener( this );
    }

    public Object getCellEditorValue() {
        return dsd_editorValue;
    }

    /**
     * returns the mnemonic to activate the button when the cell has focus
     * 
     * @return the mnemonic
     */
    public int m_getMnemonic()
    {
        return in_mnemonic;
    }

    /**
     *  The mnemonic to activate the button when the cell has focus
     *
     *  @param in_mnemonic the mnemonic
     */
    public void m_setMnemonic(int in_mnemonic)
    {
        this.in_mnemonic = in_mnemonic;
        dsd_editButton.setMnemonic(in_mnemonic);
    }

    /**
     * Get foreground color of the button when the cell has focus
     * 
     * @return the foreground color
     */
    public Border m_getFocusBorder() {
        return dsd_focusBorder;
    }

    /**
     * The foreground color of the button when the cell has focus
     * 
     * @param dsdp_focusBorder
     *            the foreground color
     */
    public void m_setFocusBorder(Border dsdp_focusBorder) {
        this.dsd_focusBorder = dsdp_focusBorder;
        dsd_editButton.setBorder(dsdp_focusBorder);
    }

    public void actionPerformed(ActionEvent arg0) {
        int in_modelRow = dsd_table.convertRowIndexToModel( dsd_table.getEditingRow() );
        fireEditingStopped();
        // Here i start a custom thread to run in the background.
    }

    public void mouseClicked(MouseEvent arg0) {
    }

    public void mouseEntered(MouseEvent arg0) {
    }

    public void mouseExited(MouseEvent arg0) {
    }

    public void mousePressed(MouseEvent arg0) {
        if (dsd_table.isEditing() && dsd_table.getCellEditor() == this)
            bo_isButtonColumnEditor = true;

    }

    public void mouseReleased(MouseEvent arg0) {
        if (bo_isButtonColumnEditor && dsd_table.isEditing())
            dsd_table.getCellEditor().stopCellEditing();

        bo_isButtonColumnEditor = false;

    }

    public void addCellEditorListener(CellEditorListener arg0) {
    }

    public void cancelCellEditing() {
    }

    public void removeCellEditorListener(CellEditorListener arg0) {
    }

    public boolean shouldSelectCell(EventObject arg0) {
        return false;
    }

    public boolean stopCellEditing() {
        return false;
    }

    public Component getTableCellEditorComponent(JTable dsd_table, Object dsd_value,
            boolean bo_isSelected, int in_row, int in_column) {

        if (!WorkplaceConstants.STR_INACTIVE.equals(dsd_table.getValueAt(in_row, dsd_table
                .getColumn(Main.hm_language.get(Language.STATUS))
                .getModelIndex())))
            return new JLabel("");


        if (dsd_value == null)
        {
            dsd_editButton.setText( "" );
            dsd_editButton.setIcon( null );
        }
        else if (dsd_value instanceof Icon)
        {
            dsd_editButton.setText( "" );
            dsd_editButton.setIcon( (Icon)dsd_value );
        }
        else
        {
            dsd_editButton.setText( dsd_value.toString() );
            dsd_editButton.setIcon( null );
        }

        bo_isButtonColumnEditor = true;

        this.dsd_editorValue = dsd_value;
        dsd_editButton.setBorder(dsd_originalBorder);
        return dsd_editButton;
    }


    public boolean isCellEditable(EventObject e){
        return true;
    }

    public Border m_getoriginalBorder() {
        return dsd_originalBorder;
    }

    public void m_set_originalBorder(Border dsd_originalBorder) {
        this.dsd_originalBorder = dsd_originalBorder;
    }


}

以下是我如何将编辑器和渲染器分配给表

public static void m_setButtonColumnConfiguration(JTable table) {
        ButtonEditor dsd_btn_edit = new ButtonEditor(table);
        dsd_btn_edit.m_setMnemonic(KeyEvent.VK_D);
        table.getColumn(/*i get the identifier for the column here*/).setCellEditor(dsd_btn_edit);
        ButtonRenderer dsd_btn_rend = new ButtonRenderer();
        dsd_btn_rend.m_setMnemonic(KeyEvent.VK_D);
        table.getColumn(/*i get the identifier for the column here*/)
                .setCellRenderer(dsd_btn_rend);
    }

1 个答案:

答案 0 :(得分:-1)

  

按钮,但是一旦按下任何按钮,表就会失去焦点

是的,无论何时点击某个组件,它都会得到焦点,所以这是有道理的。

  

,面板中唯一的交互式对象是刚刚点击的按钮,

不确定我理解这句话。您可以再次单击该表,它将重新获得焦点。然后,您可以在桌子周围导航。

也许您只是建议按钮渲染器/编辑器不按您期望的方式工作。我们无法对此进行测试,因为您没有发布SSCCE

无论如何,请查看Table Button Column以获取响应鼠标点击或键盘事件的按钮渲染器/编辑器的另一个示例。