好的,我正在制作一个2d的JToggleButtons数组。我得到了动作监听器,但我无法分辨哪个按钮是哪个。
如果我点击一个,它返回的就是
javax.swing.JToggleButton [,59,58,19x14,alignmentX = 0.0,alignmentY = 0.5,边界= javax.swing.plaf.BorderUIResource $ CompoundBorderUIResource @ 53343ed0,旗帜= 296,MAXIMUMSIZE =,=的minimumSize,首选大小= ,的DefaultIcon =,disabledIcon =,disabledSelectedIcon =,余量= javax.swing.plaf.InsetsUIResource [顶= 2,左= 14,底= 2,右= 14],的paintBorder =真,paintFocus =真,pressedIcon =,rolloverEnabled =假,rolloverIcon =,rolloverSelectedIcon =,selectedIcon =,文本=]
有没有在按钮对象中粘贴某种项目或数字来关联每个按钮? 然后当点击按钮时,我可以检索给它的项目或编号吗?
这是我的按钮生成器代码。 (我如何使“int l”与每个按钮相关联(和计数),当它被调用时,它将返回该数字,或者沿着那些行返回。
JToggleButton buttons[][] = new JToggleButton[row][col];
int l = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
buttons[i][j] = new JToggleButton("");
buttons[i][j].setSize(15,15);
buttons[i][j].addActionListener(new e());
panel.add(buttons[i][j]);
l++;
}
}
ActionListner
public class e implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
System.out.println(source);
}
}
变量“source”是我用来获取数据的东西,那么当点击一个按钮时,如何通过“source”返回(作为单击的唯一按钮的唯一值)?
谢谢, -Austin
答案 0 :(得分:3)
非常简单的方法是将ClientProperty添加到JComponent,将定义添加到循环中,例如
buttons[i][j].putClientProperty("column", i);
buttons[i][j].putClientProperty("row", j);
buttons[i][j].addActionListener(new MyActionListener());
将e
重命名为MyActionListener
并更改其内容
public class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JToggleButton btn = (JToggleButton) e.getSource();
System.out.println("clicked column " + btn.getClientProperty("column")
+ ", row " + btn.getClientProperty("row"));
}
编辑:
<{1}}克隆不需要MinerCraft
克隆来实现Listeners,只有大约Icon,在此代码中找出(不执行任何监听器和删除)使用过ItemListener)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonsIcon extends JFrame {
private static final long serialVersionUID = 1L;
private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ButtonsIcon t = new ButtonsIcon();
}
});
}
public ButtonsIcon() {
setLayout(new GridLayout(2, 2, 4, 4));
JButton button = new JButton();
button.setBorderPainted(false);
button.setBorder(null);
button.setFocusable(false);
button.setMargin(new Insets(0, 0, 0, 0));
button.setContentAreaFilled(false);
button.setIcon((errorIcon));
button.setRolloverIcon((infoIcon));
button.setPressedIcon(warnIcon);
button.setDisabledIcon(warnIcon);
add(button);
JButton button1 = new JButton();
button1.setBorderPainted(false);
button1.setBorder(null);
button1.setFocusable(false);
button1.setMargin(new Insets(0, 0, 0, 0));
button1.setContentAreaFilled(false);
button1.setIcon((errorIcon));
button1.setRolloverIcon((infoIcon));
button1.setPressedIcon(warnIcon);
button1.setDisabledIcon(warnIcon);
add(button1);
button1.setEnabled(false);
final JToggleButton toggleButton = new JToggleButton();
toggleButton.setIcon((errorIcon));
toggleButton.setRolloverIcon((infoIcon));
toggleButton.setPressedIcon(warnIcon);
toggleButton.setDisabledIcon(warnIcon);
toggleButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (toggleButton.isSelected()) {
} else {
}
}
});
add(toggleButton);
final JToggleButton toggleButton1 = new JToggleButton();
toggleButton1.setIcon((errorIcon));
toggleButton1.setRolloverIcon((infoIcon));
toggleButton1.setPressedIcon(warnIcon);
toggleButton1.setDisabledIcon(warnIcon);
toggleButton1.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (toggleButton1.isSelected()) {
} else {
}
}
});
add(toggleButton1);
toggleButton1.setEnabled(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
答案 1 :(得分:1)
只需将行和列数据添加到每个侦听器即可。你可以添加一个显式的构造函数,但我建议添加一个小方法(稍后可能会添加更多的方法)。
buttons[i][j].addActionListener(e(i, j));
...
private ActionListener e(final int i, final int j) {
return new ActionListener() {
// i and j available here
...
(在JDK8中,您应该能够使用lambda来减少语法混乱。)
然后用更好的名字重命名它。
答案 2 :(得分:0)
我做了一个扫雷游戏并遇到了类似的问题。你可以做到的唯一方法之一就是获得点击按钮的绝对位置,然后用按钮之间的x和y除以,所以对我来说是
if ((e.getComponent().getX() != (randx) * 25 && e.getComponent().getY() != (randy) * 25) &&bomb[randx][randy] == false) {
此代码用于检查该区域是否有炸弹。所以我在炸弹的位置上有25 x和y的差异。这将只是给你一个关于如何做到这一点的一般想法。
我相信:(左侧是x - x间距)/缓冲区 - 1会起作用。
答案 3 :(得分:0)
您可以随时调用'e.getActionCommand()'而不是'e.getSource()'。对于每个按钮,您可以通过以下方式指定:
JButton button = new JButton("Specify your parameters here"); /*you get these from getActionCommand*/
button.setText("title here"); /*as far as I remember*/