Java Swing在运行时添加/删除jButton

我的应用程序有一个模块,允许用户在运行时在jLayeredpane上添加jButton。我想向此动态添加的内容添加动作侦听器,而且我还必须提供在运行时删除动态添加的按钮的访问权限。有什么办法吗?

private Map<String, JButton> dynamicButtons;

public void addButton(String name) {

JButton b = new JButton(name);

b.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

jLayeredPane2.add(b);

dynamicButtons.put(name, b);

jLayeredPane2.invalidate();

}

public void removeButton(String name) {

JButton b = dynamicButtons.remove(name);

jLayeredPane2.remove(b);

jLayeredPane2.invalidate();

}

回答:

总体上不错,但是在这种情况下做的却不同

为了跟踪添加的任意数量JButtons,您需要将它们保留在列表中。

因此,在创建新按钮之后,将侦听器添加到该按钮,然后将其添加到窗格中,然后需要将该新按钮保存在列表中。

这样,您可以跟踪已添加的所有按钮。

您还可以使用Map<String, JButton>将按钮名称映射到按钮的。

例:

private Map<String, JButton> dynamicButtons;

public void addButton(String name) {

JButton b = new JButton(name);

b.addActionListener(someAction);

yourPanel.add(b);

dynamicButtons.put(name, b);

yourPanel.invalidate();

}

public void removeButton(String name) {

Button b = dynamicButtons.remove(name);

yourPanel.remove(b);

yourPanel.invalidate();

}


以下是一个完整的类,可让您动态添加和删除按钮。这并不是您想要的,但它应该可以使您真正接近。

特定情况的代码:

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.Point;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

public class ExampleFrame extends JFrame {

private JButton add, remove;

private JPanel dynamicButtonPane, addRemovePane;

private boolean waitingForLocationClick;

public ExampleFrame() {

super("Dynamic button example");

waitingForLocationClick = false;

add = new JButton("Add Button");

add.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

addButton(JOptionPane

.showInputDialog("Name of the new button:"));

}

});

remove = new JButton("Remove Button");

remove.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

lookingToRemove = true;

}

});

JPanel mainPane = new JPanel(new BorderLayout());

dynamicButtonPane = new JPanel();

dynamicButtonPane.setLayout(null);

dynamicButtonPane.setPreferredSize(new Dimension(300, 300));

addRemovePane = new JPanel();

addRemovePane.add(add);

addRemovePane.add(remove);

mainPane.add(dynamicButtonPane, BorderLayout.NORTH);

mainPane.add(addRemovePane, BorderLayout.SOUTH);

add(mainPane);

pack();

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);

dynamicButtonPane.addMouseListener(pointSelectorListener);

}

private JButton buttonToPlace;

public void addButton(String name) {

JButton b = new JButton(name);

b.setActionCommand(name);

b.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

if (lookingToRemove) {

if (e.getSource() instanceof JButton) {

dynamicButtonPane.remove((Component) e.getSource());

dynamicButtonPane.validate();

dynamicButtonPane.repaint();

}

} else

JOptionPane.showMessageDialog(ExampleFrame.this, "This is " + e.getActionCommand());

}

});

waitingForLocationClick = true;

lookingToRemove = false;

buttonToPlace = b;

}

public void putButtonAtPoint(Point p) {

System.out.println("Placing a button at: " + p.toString());

dynamicButtonPane.add(buttonToPlace);

buttonToPlace.setBounds(new Rectangle(p, buttonToPlace

.getPreferredSize()));

dynamicButtonPane.validate();

buttonToPlace = null;

waitingForLocationClick = false;

}

private boolean lookingToRemove = false;

private final MouseListener pointSelectorListener = new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

if (waitingForLocationClick) {

putButtonAtPoint(e.getPoint());

} else {

System.out.println("Not in waiting state");

}

}

};

public static void main(String[] args) {

new ExampleFrame();

}

}

以上是 Java Swing在运行时添加/删除jButton 的全部内容, 来源链接: utcz.com/qa/402214.html

回到顶部