我有一个家庭作业,它提供了一个 GUI 界面并显示十个团队,每个团队由一个按钮代表。每个按钮的左侧都有一个单选按钮,允许用户选择单选按钮,然后单击另一个团队按钮将所选团队移动到该位置。选定的团队将移动,其他团队将向上或向下移动。
这不是问题。代码已经完成,但是我有一个问题。目前它可以工作,但每次单击按钮后,程序都会对构造函数进行新的调用,然后打开该程序的另一个实例,但数据会正确转移。
我正在寻找有关如何完成这项工作的建议。我试图让它调用创建 GUI 的方法,但它无法正常工作并引发令人讨厌的异常。
我的代码如下,关注的区域是第 99 行和第 100 行。第 99 行已被注释掉。这是我尝试的方法,而不是第 100 行上的新构造函数调用。
我希望这是有道理的,并提前感谢您的任何建议。
注意:(我不是在找人帮我完成作业。我从头开始完成了这段代码,并且我已经筋疲力尽地试图解决这个问题。谢谢!)
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class P03TopTenTeams extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
String[] teams = {"Texas", "Vanderbilt", "Florida", "Missouri","Arkansas", "Kentucky", "Alabama", "Tennessee", "Georgia","Louisiana"};
new P03TopTenTeams(teams);
}
private JPanel panel1;
private JPanel panel2;
private JButton[] btn = new JButton[10];
private JRadioButton[] rbtn = new JRadioButton[10];
private ButtonGroup bg1 = new ButtonGroup();
private ButtonGroup bg2 = new ButtonGroup();
public P03TopTenTeams(String[] teams) {
buildWindow(teams);
}
private void buildWindow(String[] teams) {
int index;
this.setSize(300, 500);
this.setLocationRelativeTo(null);
this.setTitle("Top Ten Teams");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
panel1 = new JPanel();
panel1.setLayout(new GridLayout(10, 1));
for (index = 0; index < 10; index++) {
rbtn[index] = new javax.swing.JRadioButton(
Integer.toString(index + 1));
bg1.add(rbtn[index]);
panel1.add(rbtn[index]);
}
panel2 = new JPanel();
panel2.setLayout(new GridLayout(10, 1));
BtnHdlr btnhdlr = new BtnHdlr();
for (index = 0; index < 10; index++) {
btn[index] = new javax.swing.JButton(teams[index]);
bg2.add(btn[index]);
panel2.add(btn[index]);
btn[index].addActionListener(btnhdlr);
}
this.add(panel1, BorderLayout.WEST);
this.add(panel2, BorderLayout.CENTER);
this.setVisible(true);
}
private class BtnHdlr implements ActionListener {
public void actionPerformed(ActionEvent event) {
int from = 0;
int to = 0;
String[] teams = new String[10];
int index;
for (index = 0; index < bg1.getButtonCount(); index++) {
teams[index] = btn[index].getText();
if (rbtn[index].isSelected() == true) {
from = index;
}
if (btn[index].getText().equals(event.getActionCommand())) {
to = index;
}
}
updateTeamsArray(teams, from, to);
}
}
private void updateTeamsArray(String[] teams, int from, int to) {
int index;
String valueFrom = teams[from];
if (from < to) {
for (index = from; index < to; index++) {
teams[index] = teams[index + 1];
}
teams[to] = valueFrom;
} else {
for (index = from; index > to; index--) {
teams[index] = teams[index - 1];
}
teams[to] = valueFrom;
}
//buildWindow(teams);
new P03TopTenTeams(teams);
}
}
最佳答案
解决方案似乎非常明显:如果您不想调用构造函数,不要调用它!只需从 updateTeamsArray 方法中获取构造函数调用即可。
更具体地说:
- 从容纳按钮的容器中移除所有按钮
- 按照新顺序将按钮重新添加到该容器
- 在容器上调用
revalidate()
和repaint()
。 - 或者更简单地说,您可以简单地使用新顺序中的数组名称重命名您的 JButton。
例如:
private void updateTeamsArray(String[] teams, int from, int to) {
int index;
String valueFrom = teams[from];
if (from < to) {
for (index = from; index < to; index++) {
teams[index] = teams[index + 1];
}
teams[to] = valueFrom;
} else {
for (index = from; index > to; index--) {
teams[index] = teams[index - 1];
}
teams[to] = valueFrom;
}
// buildWindow(teams);
// new P03TopTenTeams(teams); // delete this!
// ***** add this *****
for (int i = 0; i < teams.length; i++) {
btn[i].setText(teams[i]);
}
}
关于java - 如何使我的java程序在使用参数调用构造函数时不创建多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970338/