我创建了一个动态数量的按钮,并且我无法按照自己的意愿为每个按钮命名,每个按钮内的文本也必须为空,所以我也不能使用它。另一方面,我需要通过整数(甚至两个整数)来识别每个按钮
在下面你有我的特定类的代码:
package view;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JFrame;
import view.Nodes.Node;
public class AdjacencyMatrixWindow {
public JFrame frame;
int index;
LinkedList<Node> nodes;
int rowNumber=1;
Iterator<Node> nodeIter;
JButton btn;
public AdjacencyMatrixWindow(int index,LinkedList<Node> nodes) {
this.index=index;
this.nodes=nodes;
sortNodes();
for (Node node : nodes)
sortConnecteds(node.isConnectedToNodes);
nodeIter = nodes.iterator();
initialize();
apply();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 358, 297);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(nodes.size()+1, nodes.size()+1));
}
public void insertFirstRowLabels()
{
for (int i=0;i<=nodes.size();i++)
{
if (i==0)
{
Label lbl = new Label(" ");
lbl.setBackground(new Color(240,240,240));
frame.getContentPane().add(lbl);
}
else
{
Label lbl = new Label(String.valueOf(i));
frame.getContentPane().add(lbl);
}
}
}
public void insertRow(Node node)
{
for (int i=0;i<=nodes.size();i++)
{
if (i==0)
{
Label lbl = new Label(String.valueOf(rowNumber));
frame.getContentPane().add(lbl);
rowNumber++;
}
else
{
if (node.isConnectedToNodes.contains(node.getNodeByID(i)))
{
btn = new JButton("T");
frame.getContentPane().add(btn);
}
else
{
btn = new JButton(" ");
frame.getContentPane().add(btn);
}
}
}
}
public int columnNumbers()
{
if (nodeIter.hasNext())
return Integer.parseInt(nodeIter.next().getNodeID());
return -1;
}
public void apply()
{
insertFirstRowLabels();
for (int i=0;i<=nodes.size()-1;i++)
{
insertRow(nodes.get(columnNumbers()-1));
}
}
public void sortNodes()
{
Collections.sort(nodes, new Nodes.IDComperator());
}
public void sortConnecteds(LinkedList<Node> node)
{
Collections.sort(node, new Nodes.IDComperator());
}
Runnable selectAndDraw = new Runnable()
{
public void run()
{
btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent b) {
}});
}
};
}
抱歉,代码写得不是很干净。
答案 0 :(得分:2)
另一方面,我需要用整数(甚至两个整数)来识别每个按钮
您可以为按钮设置操作命令:
button.setActionCommand("1");
action命令是一个String,用于标识单击的按钮,因此它可以是包含两个数字的字符串(您需要解析String以获取这两个数字)。
然后在ActionListener
中,您可以从ActionEvent
String actionCommand = event.getActionCommand();
答案 1 :(得分:0)
您可以创建一个继承JButton
类的新类,并在类中包含要存储的Integer
值。
我用JPanels
做了这个。我希望在我的窗口上显示多个面板,并显示不同的信息。所以我创建了自己的对象,继承了JPanel
。
这是一些示例代码:
添加JPanel(注意:holdingPanel
只是当前窗口上的另一个JPanel
)...
ScanBarcode scanBarcodePanel = new ScanBarcode();
scanBarcodePanel.setLabelText(barcodeLabel);
scanBarcodePanel.setBarcodeText(initialBarcodeText);
this.holdingPanel.add(scanBarcodePanel);
this.revalidate();
重新验证对于添加组件后显示的所有内容非常重要。
setLabelText
和setBarcodeText
是ScanBarcode
类中的自定义方法。
自定义JPanel:
public class ScanBarcode extends JPanel {
public ScanBarcode() {
super();
initComponents();
}
...
}
希望有所帮助。