2010-02-17 7 views
0

J'essaie de créer ma première application graphique en utilisant (Java + Eclipse + Swing). Ceci est mon code:Pourquoi mon application graphique basée sur Swing ne répond pas?

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


public class HelloWorldSwing extends JFrame { 

     JTextArea m_resultArea = new JTextArea(6, 30); 

     //====================================================== constructor 
     public HelloWorldSwing() { 
      //... Set initial text, scrolling, and border. 
      m_resultArea.setText("Enter more text to see scrollbars"); 
      JScrollPane scrollingArea = new JScrollPane(m_resultArea); 
      scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5)); 

      // Get the content pane, set layout, add to center 
      Container content = this.getContentPane(); 
      content.setLayout(new BorderLayout()); 
      content.add(scrollingArea, BorderLayout.CENTER); 
      this.pack(); 
     } 

     //============================================================= main 
     public static void main(String[] args) { 
      JFrame win = new HelloWorldSwing(); 
      win.setTitle("TextAreaDemo"); 
      win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      win.setVisible(true); 
     } 


} 

Le code a été prise de here.

Lorsque j'exécute l'application à partir d'Eclipse, la fenêtre attendue apparaît (donc, c'est bon, je vois ce que je veux voir). Toutefois, lorsque j'essaie de fermer la fenêtre ou d'essayer d'écrire quelque chose dans la zone de texte, le programme se fige. L'OS m'écrit que le programme ne répond pas (je l'essaie sur Ubuntu).

Quelqu'un peut-il m'aider à trouver la raison du problème?

Merci d'avance pour toute aide.

+0

J'ai essayé le code fourni et ça marche bien ... Y at-il autre chose que vous faites?Est-ce que cela fonctionne quand vous commentez le contenu du constructeur pour obtenir un 'JFrame' vide, et essayez de le fermer? –

+0

Ce n'est pas une question de code. Cela fonctionne très bien sur ma machine Windows. ferme et écrit comme prévu. n'utilise-tu pas une beta jvm ou quelque chose? – Oso

+0

J'ai essayé de commenter cette ligne du code: content.add (scrollingArea, BorderLayout.CENTER); et j'ai toujours le même problème. Une fenêtre vide apparaît et elle ne répond pas. – Roman

Répondre

1

Je suis sûr que cela n'a pas à voir avec le code, comme d'autres ont trouvé le code fonctionne très bien sur leurs machines - qui pointe vers une machine question spécifique. Depuis Eclipse, assurez-vous qu'il est configuré pour utiliser le JDK/JRE attendu. Cependant, avant de m'inquiéter de la façon dont Eclipse gère votre situation, je courrais d'abord les choses à la main - d'autant plus que vous avez une classe très simple.

Je vérifie pour m'assurer que vous utilisez le compilateur attendu et l'exécution. Sous Linux:

which javac 
which java 

Si elles sont à la fois ce que vous attendez, procédez comme suit:

javac HelloWorldSwing.java 
java HelloWorldSwing 

Si vous avez un problème similaire, alors vous savez que ce n'est pas la configuration Eclipse et il est autre chose. Si vous n'utilisez pas le dernier JDK, passez à la dernière version. Si vous êtes déjà au plus tard, cela pourrait être un pilote d'affichage. Est-ce que d'autres programmes swing JAVA fonctionnent sur cet ordinateur? Je suis sûr que vous pourriez en trouver sur le net, télécharger une application déjà emballée comme un pot et essayez de l'exécuter.

-2

Vous devez attraper l'événement de sortie et répondre avec une System.exit(0);

Vous devriez être en mesure de constater que dans la plupart des exemples swing en ligne.

mal ça ... désolé ... le café ... argh ....

+1

«JFrame.EXIT_ON_CLOSE» ne devrait-il pas s'en occuper? –

+0

thats mauvais conseil, étant donné que vous avez une certaine logique dans une méthode de destruction d'un JFrame il ne serait pas exécuté lors de l'appel System.exit() – fasseg

0

avez-vous essayer d'utiliser le eventdispatcherthread pour voir le JFrame?

quelque chose comme:

public static void main(String[] args){ 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      createAndViewJFrame(); 
     } 
    }); 
} 

public void createAndViewJFrame(){ 
    JFrame win = new HelloWorldSwing(); 
    win.setTitle("TextAreaDemo"); 
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    win.setVisible(true); 
} 

alors votre cadre serait montré par le fil de répartiteur de swing.

espère que cela a aidé, même si im juste deviner ...

Mise à jour: comme vous l'avez souligné commenters i f ** ed l'appel invokeLater(). Je viens de modifier ce post pour corriger cela. Thanx aller à yishai & willcodejavaforfood pour le signaler!

franche

+1

Ce n'est pas comment vous appelez la méthode invokeLater. – Yishai

+0

bien c'est proche :) – willcodejavaforfood

+2

SwingUtilities.invokeLater (nouveau Runnable() {public void run() {createAndViewJFrame()}); – willcodejavaforfood

Questions connexes