2010-12-16 11 views
1

私はJava Swingでかなり新しく、JtableセルのJbuttonにいくつか問題があります。JtableセルのJbuttonは一度しか動作しません

問題は、Jbuttonは一度しか動作せず、機能していないということです。 初めて初めてクリックすると、何も起こりません。getTableCellEditorComponentは一度だけ呼び出されます。 通常のボタンとして機能したいです。次のように

マイボタンエディタとボタンレンダラークラスは以下のとおりです。私はhttp://download.oracle.com/javase/6/docs/api/に私が参照してください。これをしなければならないとき

package buttonontable; 

import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.EventObject; 
import java.util.HashMap; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JOptionPane; 
import javax.swing.JTable; 
import javax.swing.event.CellEditorListener; 
import javax.swing.event.ChangeEvent; 
import javax.swing.table.TableCellEditor; 


public class MyButtonEditor extends JButton implements TableCellEditor { 
    protected JButton button; 
    ButtonOnJtableAction buttonOnJtableAction; 

    String labelStr; 




    public MyButtonEditor(String buttonStr,ButtonOnJtableAction _buttonOnJtableAction) { 
    super(buttonStr); 
    buttonOnJtableAction = _buttonOnJtableAction; 
    button = new JButton(); 
    button.setOpaque(true); 
    System.out.println("MyButtonEditor constructed"); 

    } 

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


     System.out.println("getTableCellEditorComponent"); 
     JOptionPane.showMessageDialog(table, "Pressed at " + row + "x" + column); 
     buttonOnJtableAction.buttonPressed(table,row,column); 
     return this; 
    } 

    public void cancelCellEditing() { 
     System.out.println("cancelCellEditing"); 
     System.out.println("Cancel"); 
    } 

    public boolean stopCellEditing() { 
     System.out.println("stopCellEditing"); 
     return true; 
    } 

    public Object getCellEditorValue() { 
     System.out.println("getCellEditorValue"); 
     return null; 
    } 

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

    public boolean shouldSelectCell(EventObject anEvent) { 
     return true; 
    } 

    public void addCellEditorListener(CellEditorListener l) { 
    } 

    public void removeCellEditorListener(CellEditorListener l) { 
    } 

    protected void fireCellEditing(ChangeEvent e){ 

    } 

} 



    package buttonontable; 

    import java.awt.Component; 
    import javax.swing.JButton; 
    import javax.swing.JTable; 
    import javax.swing.UIManager; 
    import javax.swing.table.TableCellRenderer; 


     public class MyButtonRenderer extends JButton implements TableCellRenderer { 

      String buttonStr; 
      public MyButtonRenderer(String _buttonStr) { 
      setOpaque(true); 
      buttonStr = _buttonStr; 
      setText(buttonStr); 
      } 

      public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) { 

      System.out.println("getTableCellRendererComponent"); 

      if (isSelected) { 
       setForeground(table.getSelectionForeground()); 
       setBackground(table.getSelectionBackground()); 
      } else{ 
       setForeground(table.getForeground()); 
       setBackground(UIManager.getColor("Button.background")); 
      } 
      setText((value ==null) ? buttonStr : value.toString()); 
      return this; 
      } 
     } 
+0

ポストButtonOnJTableActionとあなたを含め、すべてのクラスを、 main()(pastebを使う必要に応じて)。 – Kylar

答えて

1

通常、ページの左側にあるとのJTableの冒頭でJTableのに行きますjavadocページには「テーブルの使い方」へのリンクがあります。一番下には、JTableにボタンを配置する方法の例があります。そのページのセクションが「他のエディタの使用」であるように見えます。私は通常SUNが指定したものに従います。うまくいけばそれはちょっと役立ちます...

1

通常のボタンとして機能したいです。

ボタンが押されたときにアクションを呼び出す場合は、1つの手法でTable Button Columnをチェックアウトすることができます。

0

Escにお試しください。もう一度クリックしてください。それが今働くなら、それは焦点の問題です。
修正しないでください。camickr's answerまたはspin-offに従ってください。

基本的なアウトラインは次のようにする必要があります

レンダラ:

class MyClassCellRenderer implements TableCellRenderer { 

private final JButton button; 

public MyClassCellRenderer() { 
    button = new JButton(); 
    button.setFocusable(false); 
} 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value,  boolean isSelected, boolean hasFocus, int row, int column) { 
    button.setText(((Contact)value).getName()); 
    return button; 
} 
} 

エディタ:

class MyClassCellEditor extends AbstractCellEditor implements TableCellEditor { 
private final JButton button; 

public MyClassCellEditor() { 
    button = new JButton(new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     logger.trace("I"); 
    } 
    }); 
    button.setFocusable(false); 
} 

@Override 
public Component getTableCellEditorComponent(JTable table, Object value,  boolean isSelected, int row, int column) { 
    button.setText(((Contact)value).getName()); 
    return button; 
} 

@Override 
public Object getCellEditorValue() { 
    return null; 
} 
} 

使用法:

model.getColumn(0).setCellRenderer(new MyClassCellRenderer()); 
model.getColumn(0).setCellEditor(new MyClassCellEditor()); 
+0

私は2ユースと同じパターンを試みました。 しかし、jtableのセル内でjpanelをコンテナとして使用し、そのjpanelの内側に別のボタンを配置すると、ボタン自体が正しくアニメーション化されません。 :( – gumuruh

+0

"正しくアニメーション化されません" - アニメーションのプレス/リリース? – Asaf

関連する問題