JFrame一遍又一遍地打开

时间:2014-10-20 15:42:11

标签: java swing jframe

我遇到了这个程序的麻烦。一切正常,但程序一遍又一遍地打开JFrame(显然,我只想要打开一个JFrame)。我的代码出了什么问题?

提前谢谢你, 斯蒂芬

 import java.util.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

public class ColoredWords {
  JFrame frame;
  JPanel controlPanel, wordsPanel;
  JButton match, nomatch;

  ColoredWords() {

    SwingUtilities.invokeLater( new Runnable() {
      @Override
      public void run() {
        frame = new JFrame("Colored Words Experiment");
        wordsPanel = new JPanel();
        controlPanel = new JPanel();
        frame.setLayout(new BorderLayout());
        frame.add(wordsPanel, BorderLayout.NORTH);
        frame.add(controlPanel, BorderLayout.SOUTH);
        frame.setSize(1000, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        match = new JButton("Matching");
        nomatch = new JButton("Non-Matching");
        controlPanel.add(match, BorderLayout.WEST);
        controlPanel.add(nomatch, BorderLayout.CENTER);
        ClicksReporter clicksreporter;
        clicksreporter =  new ClicksReporter();
        match.addActionListener(clicksreporter);
        nomatch.addActionListener(clicksreporter);
      }
    } );
  }


  class ClicksReporter extends ColoredWords implements ActionListener {
    Labeling labeling = new Labeling();
    public void actionPerformed(ActionEvent e) { 
      if (e.getActionCommand().equals("Matching")) {
        wordsPanel.add(labeling);
      } else if (e.getActionCommand().equals("Non-Matching")) {
        wordsPanel.add(labeling);
      }
    }
  }


  public static void main(String[] arg) {
    new ColoredWords();
  }
}

class Labeling extends JPanel {
  JLabel[] labelsList = new JLabel[20];
  int i = 0;

  public Labeling() {
    while (i < 5) {  
      labelsList[i] =  new JLabel("black");
      setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
      labelsList[i].setOpaque(true);
      labelsList[i].setBackground(Color.white);
      add(labelsList[i]);
      i++;
    }
  }
}

3 个答案:

答案 0 :(得分:1)

问题是当您在ClicksReporter内实例化main()时。这是因为它继承了ColoredWords的构造函数,在实例化时调用它。为避免这种情况,您可以将程序代码从构造函数中移除到另一个方法,例如execute()run()。然后,您可以相应地调整您的程序,以便在main()

中调用此方法

答案 1 :(得分:0)

您的ColoredWords构造函数调用clicksreporter = new ClicksReporter();ClicksReporter继承ColoredWords,因此调用ColoredWords的构造函数,将再次执行clicksreporter = new ClicksReporter();等等......你陷入无限循环。尝试删除继承。

答案 2 :(得分:0)

  1. 您在JFrame构造函数中创建了一个新的ColoredWords
  2. 您在ClicksReporter构造函数中创建了一个新的ColoredWords
  3. ClicksReporter扩展ColoredWords
  4. 这意味着每个ColoredWords构造都会导致另一个ColoredWords构造,这也会创建JFrame