2011-04-04 44 views
0

我想使用這個例子http://www.devx.com/getHelpOn/10MinuteSolution/20425 但有一個問題,我不知道如何編寫我的按鈕的動作偵聽器,我的意思是我知道,但在哪裏?問題在行動監聽器

請指教我。 我把上面的例子放在這裏。

如果您有任何更好的例子,請通知我也...

import com.sun.java.swing.*; 
import com.sun.java.swing.table.*; 
import java.awt.*; 
import java.awt.event.*; 

class JTableButtonRenderer implements TableCellRenderer { 
    private TableCellRenderer __defaultRenderer; 

    public JTableButtonRenderer(TableCellRenderer renderer) { 
    __defaultRenderer = renderer; 
    } 

    public Component getTableCellRendererComponent(JTable table, Object value, 
         boolean isSelected, 
         boolean hasFocus, 
         int row, int column) 
    { 
    if(value instanceof Component) 
     return (Component)value; 
    return __defaultRenderer.getTableCellRendererComponent(
     table, value, isSelected, hasFocus, row, column); 
    } 
} 

class JTableButtonModel extends AbstractTableModel { 
    private Object[][] __rows = { 
     { "One", new JButton("Button One") }, 
     { "Two", new JButton("Button Two") }, 
     { "Three", new JButton("Button Three") }, 
     { "Four", new JButton("Button Four") } 
    }; 

    private String[] __columns = { "Numbers", "Buttons" }; 

    public String getColumnName(int column) { 
    return __columns[column]; 
    } 

    public int getRowCount() { 
    return __rows.length; 
    } 

    public int getColumnCount() { 
    return __columns.length; 
    } 

    public Object getValueAt(int row, int column) { 
     return __rows[row][column]; 
    } 

    public boolean isCellEditable(int row, int column) { 
    return false; 
    } 

    public Class getColumnClass(int column) { 
    return getValueAt(0, column).getClass(); 
    } 
} 

class JTableButtonMouseListener implements MouseListener { 
    private JTable __table; 

    private void __forwardEventToButton(MouseEvent e) { 
    TableColumnModel columnModel = __table.getColumnModel(); 
    int column = columnModel.getColumnIndexAtX(e.getX()); 
    int row = e.getY()/__table.getRowHeight(); 
    Object value; 
    JButton button; 
    MouseEvent buttonEvent; 

    if(row >= __table.getRowCount() || row < 0 || 
     column >= __table.getColumnCount() || column < 0) 
     return; 

    value = __table.getValueAt(row, column); 

    if(!(value instanceof JButton)) 
     return; 

    button = (JButton)value; 

    buttonEvent = 
     (MouseEvent)SwingUtilities.convertMouseEvent(__table, e, button); 
    button.dispatchEvent(buttonEvent); 
    // This is necessary so that when a button is pressed and released 
    // it gets rendered properly. Otherwise, the button may still appear 
    // pressed down when it has been released. 
    __table.repaint(); 
    } 

    public JTableButtonMouseListener(JTable table) { 
    __table = table; 
    } 

    public void mouseClicked(MouseEvent e) { 
    __forwardEventToButton(e); 
    } 

    public void mouseEntered(MouseEvent e) { 
    __forwardEventToButton(e); 
    } 

    public void mouseExited(MouseEvent e) { 
    __forwardEventToButton(e); 
    } 

    public void mousePressed(MouseEvent e) { 
    __forwardEventToButton(e); 
    } 

    public void mouseReleased(MouseEvent e) { 
    __forwardEventToButton(e); 
    } 
} 

public final class JTableButton extends JFrame { 
    private JTable __table; 
    private JScrollPane __scrollPane; 

    public JTableButton() { 
    super("JTableButton Demo"); 
    TableCellRenderer defaultRenderer; 

    __table = new JTable(new JTableButtonModel()); 
    defaultRenderer = __table.getDefaultRenderer(JButton.class); 
    __table.setDefaultRenderer(JButton.class, 
        new JTableButtonRenderer(defaultRenderer)); 
    __table.setPreferredScrollableViewportSize(new Dimension(400, 200)); 
    __table.addMouseListener(new JTableButtonMouseListener(__table)); 

    __scrollPane = new JScrollPane(__table); 
    setContentPane(__scrollPane); 
    } 

    public static void main(String[] args) { 
    Frame frame; 
    WindowListener exitListener; 

    exitListener = new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
    Window window = e.getWindow(); 
    window.setVisible(false); 
    window.dispose(); 
    System.exit(0); 
     } 
    }; 

    frame = new JTableButton(); 
    frame.addWindowListener(exitListener); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

回答

1
new JButton("Button One").addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 

這是最簡單的方法。您也可以創建一個常規類,實現ActionListener接口並將其對象傳遞給addActionListener方法。在這個例子中,我使用了匿名類。

您的代碼進入actionPerformed方法。當有人點擊按鈕時它會被執行。的

+1

我不能在這裏這樣做!因爲它認爲我所說的空函數,但它需要對象! – Amir 2011-04-04 06:32:07

+0

對不起,我只是貼了一個例子,你通常會如何做到這一點。您的IDE顯示的錯誤(即類型不匹配:無法從void轉換爲Object)存在,因爲您在添加我的代碼時將addActionListener返回值作爲新表格元素傳遞,而不是JButton。你需要做的是首先在表外創建JButton,添加actionListeners,然後將JButton添加到表中,就像在Dhruv Gairola提供的第二個代碼塊中一樣。 – byyyk 2011-04-04 07:06:15

+0

感謝byyyk爲您提供的信息 – Amir 2011-04-04 08:42:41

0

代替

class JTableButtonModel extends AbstractTableModel { 
    private Object[][] __rows = { 
     { "One", new JButton("Button One") }, 
     { "Two", new JButton("Button Two") }, 
     { "Three", new JButton("Button Three") }, 
     { "Four", new JButton("Button Four") } 
    }; 

class JTableButtonModel extends AbstractTableModel { 
    JButton b1 = new JButton("Button One"); 
    JButton b2 = new JButton("Button Two"); 
    JButton b3 = new JButton("Button Three"); 
    JButton b4 = new JButton("Button Four"); 
    //do this for all buttons 
    b1.setActionCommand("b1"); 
    b1.addActionListener(this); 
    //....do this for b2, b3 and b4 
    private Object[][] __rows = { 
     { "One", b1 }, 
     { "Two", b2}, 
     { "Three", b3 }, 
     { "Four", b4} 
    }; 
    //the rest of the code 
} 

然後你會需要實現ActionListener並覆蓋actionPerformed方法,像這樣:

//detect the ActionEvents and handle accordingly 
    public void actionPerformed(ActionEvent e) { 
     //gets the action command 
     String cmd = e.getActionCommand(); 

     //if Button One was clicked 
     if("b1".equals(cmd)) { 
      //do something 
     } 
    //... do this for all buttons 
    } 

請注意,您提供的鏈接不是你想要完成的事情的一個很好的例子。

編輯:

至於你提到的actionPerformed是一個空白的問題,請注意,在這個功能,你只是檢測事件和哪個按鈕造成的。那麼在各自的if語句中,可以通過調用某個接受對象的方法來操縱對象。

//if Button One was clicked 
    if("b1".equals(cmd)) { 
     Object doSomethingWithB1(); 
    }