在我正在设计的代码中,我在我的应用程序的主JFrame中实例化了一个JButton,它使用ActionListener在另一个类/组件中引用actionPerformed方法。我想知道在运行所述actionPerformed方法(点击它)时是否有办法删除该按钮。换句话说,actionPerformed方法是否可以引用回激活它的按钮?
答案 0 :(得分:0)
您是否可以获得导致ActionListener激活的对象的引用?是通过ActionEvent参数的getSource()
方法。
即,
public void actionPerformed(ActionEvent evt) {
Object theSource = evt.getSource();
}
虽然有警告:如果您在多个设置中使用此ActionListener或Action,例如菜单,则源可能根本不是按钮。
至于使用它来“删除”按钮,你需要获得组件的容器,如:
public void actionPerformed(ActionEvent evt) {
JButton button = (JButton) evt.getSource(); // danger when casting!
Container parent = button.getParent();
parent.remove(button);
parent.revalidate();
parent.repaint();
}
但是,我必须警告说,如果事件不是由JButton引起的,或者如果父使用的布局管理器没有被删除,那么你将遇到麻烦。我不得不怀疑在这里使用CardLayout会更好。
如,
import java.awt.Container;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class RemoveButton extends JPanel {
private static final long serialVersionUID = 1L;
private static final int BUTTON_COUNT = 5;
private Action removeMeAction = new RemoveMeAction("Remove Me");
public RemoveButton() {
for (int i = 0; i < BUTTON_COUNT; i++) {
add(new JButton(removeMeAction));
}
}
private static void createAndShowGui() {
RemoveButton mainPanel = new RemoveButton();
JFrame frame = new JFrame("Remove Buttons");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class RemoveMeAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public RemoveMeAction(String name) {
super(name); // to set button's text and actionCommand
}
@Override
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
// AbstractButton is the parent class of JButton and others
if (source instanceof AbstractButton) {
AbstractButton button = (AbstractButton) source;
Container parent = button.getParent();
parent.remove(button);
parent.revalidate();
parent.repaint();
}
}
}