动作监听器中的问题

时间:2011-04-04 06:14:07

标签: java actionlistener

我想使用此示例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);
  }
}

3 个答案:

答案 0 :(得分:1)

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

        }
    });

这是最简单的方法。您还可以创建一个实现ActionListener接口的常规类,并将其对象传递给addActionListener方法。在这个示例中,我使用了匿名类。

您的代码进入actionPerformed方法。当有人点击按钮时,它将被执行。

答案 1 :(得分: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();
   }

答案 2 :(得分:0)

  

如果您有更好的例子,请告知我......

也许,Table Button Column