java - 如何使我的java程序在使用参数调用构造函数时不创建多个实例?

标签 java constructor

我有一个家庭作业,它提供了一个 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/

相关文章:

java 提示数组的数组的数组索引越界

java - 如何通过Weblogic Java API检索Weblogic的Deployment测试点

C#:具有继承类型构造函数的 Func

java - 在java中调用构造函数

java - 在调用父类(super class)型构造函数之前无法引用 "X",其中 x 是最终变量

java - 让 JTextArea 显示不带抗锯齿的固定宽度字体

java - GSSAPI 之后 JNDI 搜索不起作用(使用 Kerberos 进行身份验证)

java - 为了在 Swing 中执行多对象验证,应该通过异常或返回 Result 对象来报告验证失败?

java - Java构造函数中的循环依赖

c++ 隐式复制构造函数是否复制数组成员变量?