2014-04-16 115 views
0

我有一个jtable与自定义编辑器和渲染器应用于列将列的内容变成一个按钮,但是一旦我按任何按钮,表失去焦点,和只有面板中的交互式对象是刚才单击的按钮,可以重复点击。JTable失去焦点后按下按钮

这里是按钮渲染代码:

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

按钮,但是一旦我按任何bu ttons,表失去焦点

是的,任何时候你点击一个组件它会得到重点,所以这是有道理的。

,并在面板中唯一的互动对象就是刚才点击了按钮,

不知道我理解这个说法。你可以再次点击表格,它会重新获得焦点。然后,您可以在表格周围导航。

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

无论如何,检查出Table Button Column作为响应鼠标点击或键盘事件的按钮渲染器/编辑器的另一个示例。

+0

执行按钮动作侦听器后,除了按钮外,我无法从表格的任何部分获得任何反馈。例如,表格突出显示您点击的行。这不再显示。同一列中的其他按钮也不再执行其功能 – mangusbrother

+0

关于您给出的示例,我看不到任何区别。 – mangusbrother

+0

我添加了一些更多的细节。我是否需要为其添加其他内容作为SSCCE? – mangusbrother

相关问题