我想使用此示例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);
}
}
答案 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)
如果您有更好的例子,请告知我......