2013-09-23 21 views
2

我有一個家庭作業任務,提供一個GUI界面,並顯示十個團隊,每個團隊由一個按鈕代表。每個按鈕的左側都有一個單選按鈕,允許用戶選擇收音機,然後單擊另一個球隊按鈕將選定的球隊移動到該位置。選定的隊伍將會移動,其他隊伍會上下移動。如何在調用帶參數的構造函數時讓我的java程序不創建多個實例?

這不是問題。代碼是完整的,但是,我有一個問題。目前它可以正常工作,但每次點擊一個按鈕後,程序會對構造函數進行新的調用,然後再打開該程序的另一個實例,但數據會正確移位。

我正在尋找關於如何使這項工作的建議。我試圖讓它調用創建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); 

} 
} 
+0

你要一次創建實例,如果你需要事後返回同一個實例? – Prateek

+0

每次點擊按鈕後,我希望面板刷新,按鈕重新排列爲陣列的新順序。 – billabrian6

回答

2

該解決方案似乎非常明顯:如果你不想要構造函數調用,不要叫它!只需從您的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]); 
    } 
} 
+0

我試過了。我嘗試了直接在它上面註釋掉的方法調用。它不像我想的那樣刷新面板。只是崩潰。 – billabrian6

+0

@ billabrian6:查看上次建議以獲取最簡單的解決方案。 –

+0

@ billabrian6:例如... –

相關問題