2012-01-31 130 views
0

下面是和我正在執行的代碼運行多次的示例代碼。代碼運行多次

第一類:

public class Test2 extends JFrame { 
public static int asd = 0; 

private JPanel contentPane; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Test2 frame = new Test2(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 


public Test2() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JButton btnShowtest = new JButton("ShowTest2"); 
    btnShowtest.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      Test1 a1 = new Test1(); 
      a1.setVisible(true); 
      dispose(); 
     } 
    }); 
    contentPane.add(btnShowtest, BorderLayout.CENTER); 
} 
} 

當按鈕被按下時這一個打開:

public class Test1 extends JFrame { 
public static int ab = 1; 

private JPanel contentPane; 


public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Test1 frame = new Test1(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 


public Test1() { 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JButton btnrun = new JButton("runt"); 
    btnrun.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Test3.error(); 
     } 
    }); 
    contentPane.add(btnrun, BorderLayout.CENTER); 
} 
} 

當按下按鈕,它執行該代碼:

public class Test3 { 
public static void error(){ 
    JOptionPane.showMessageDialog(null, "error"); 
    Test2.asd += 1; 
    System.err.print(Test2.asd); 
    final Frame[] frames = Frame.getFrames(); 
    for (Frame f : frames){ 
     f.dispose(); 
     Test2 newtet = new Test2(); 
     newtet.setVisible(true); 
    } 
} 
} 

現在,每當我按時間該按鈕再次執行Test3.error();多次。 例如,如果我按下按鈕10次然後Test3.error();運行10次。

我猜這是一個簡單的修復,但我無法弄清楚。

編輯:

當我按下它運行「Test3.error()」代碼,然後關閉所有的幀,並創建另一個主框架btnrun按鈕。

當我回到btnrun並再次按下時,它運行「Test3.error()」2次而不是一次。 2個JOptionePanes並創建兩個新的大型機。

如果我再做一遍,它會運行「Test3.error()」3次,並繼續這樣做。

我想要的是它總是運行「Test3.error()」只是一次,但由於某種原因它沒有。

又如:

public class Frame1 extends JFrame { 

private JPanel contentPane; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Frame1 frame = new Frame1(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 


public Frame1() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JButton btnRun = new JButton("Run"); 
    btnRun.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      Run.run(); 
     } 
    }); 
    contentPane.add(btnRun, BorderLayout.CENTER); 
} 

}

並運行該代碼:

public class Run { 
public static void run(){ 
    final Frame[] frames = Frame.getFrames(); 
    for (Frame f : frames){ 
     f.dispose(); 
     Frame1 newtet = new Frame1(); 
     newtet.setVisible(true); 
} 

}}

同樣的問題。

每次我按下運行按鈕,它會執行代碼的次數是我過去按下的次數。

按下按鈕一旦它消除Frame1並重新創建Frame1。 再按一次,它連續執行2次代碼。 (作主幀1,創建幀1,diposes幀1,並創建幀1)

+1

我很困惑,這是什麼問題?此外,如果我按下按鈕10次,我預計這個按鈕執行10次。 – Alexandre 2012-01-31 19:26:37

+0

代碼應該總是運行一次,但每次我再次運行它會添加另一個「實例」 – Jixi 2012-01-31 19:31:36

回答

2

是的,你在這裏添加的動作偵聽器:

JButton btnrun = new JButton("runt"); 
btnrun.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     Test3.error(); 
    } 
}); 

意味着「當單擊該按鈕,呼叫Test3.error()。 「您是否期望執行一次後自動移除動作偵聽器?

編輯:好吧,我想我已經弄清楚發生了什麼事。這就是問題所在:

final Frame[] frames = Frame.getFrames(); 
for (Frame f : frames){ 
    f.dispose(); 
    Test2 newtet = new Test2(); 
    newtet.setVisible(true); 
} 

對於現有的框架,你處置該幀,並創建一個新的Test2()。因此,如果您單擊按鈕時屏幕上有3個框架(Test1,Test2和Test3),則最終會有三個新幀Test2。我懷疑你不是這個意思。你的意思是呢?

for (Frame f : Frame.getFrames()){ 
    f.dispose(); 
} 
Test2 newtet = new Test2(); 
newtet.setVisible(true); 
+0

因此,actionlistener是乘法?如果是的話,是的。 – Jixi 2012-01-31 19:31:47

+0

@Jixi:不,它不是相乘。您按下按鈕10次,並執行10次...每次點擊一次。那有什麼問題? – 2012-01-31 19:34:04

+0

我按下按鈕一次,爲什麼按10次? 也許我不夠清楚,每次按下按鈕都會被創建第一幀的新實例。 現在,當我按下運行按鈕時,它會執行代碼一次,但是如果我已經按下了一次,現在再按一次,它會自動執行兩次代碼,依此類推。 – Jixi 2012-01-31 19:37:38