2014-10-20 4 views
0

У меня проблемы с этой программой. Все работает, но программа продолжает открывать 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++; 
    } 
    } 
} 
+0

Я рекомендую вам прочитать [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) , Вместо этого используйте [Макет карты] (http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html#card). – Frakcool

ответ

1

Проблема заключается в том, когда вы инстанцируете ClicksReporter внутри main(). Это потому, что он наследует конструктор ColoredWords, вызывая его при создании экземпляра. Чтобы этого избежать, вы можете вывести код программы из конструктора и в другой метод, скажем, execute() или run(). Затем вы можете настроить свою программу, чтобы вызвать этот метод в main().

0

Ваш ColoredWords конструктор вызывает clicksreporter = new ClicksReporter(); но ClicksReporter наследует ColoredWords, поэтому конструктор ColoredWords вызывается, которым будет снова выполнить clicksreporter = new ClicksReporter(); и так далее ... Вы застряли в бесконечном цикле. Попробуйте удалить наследование.

0
  1. Вы создаете новый JFrame в своем конструкторе ColoredWords.
  2. Вы создаете новый ClicksReporter в своем конструкторе ColoredWords.
  3. ClicksReporter распространяется ColoredWords.

Это означает, что каждый ColoredWords строительства ведет к другой ColoredWords конструкции, которая также создает JFrame.