Voici le code:Pourquoi je ne peux pas ajouter un JPanel à JFrame?
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.event.*;
import java.awt.*;
public class GameWindow {
private String[] players;
private JFrame frame;
// Constructor.
public GameWindow(String[] players) {
this.players = players;
}
// Start the window in the EDT.
public void start() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showWindow();
controller.start();
}
});
}
// Defines the general properties of and starts the window.
public void showWindow() {
frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,400);
frame.setVisible(true);
}
// The thread controlling changes of panels in the main window.
private Thread controller = new Thread() {
public void run() {
frame.add(generatePartnerSelectionPanel());
frame.invalidate();
frame.validate();
}
};
// Generate the panel for the selection of a partner.
private JPanel generatePartnerSelectionPanel() {
JPanel panel = new JPanel();
panel.add(new JLabel("Pleas select a partner:"));
return panel;
}
}
je devrais voir « Moyens sélectionner le partenaire » et je ne. Pourquoi?
Je suppose que c'est parce que je ne vois pas d'image de la méthode d'exécution du Thread.
AJOUTÉE:
Peut être que je dois faire toutes les mises à jour dans le fil de distribution d'événements ... Je vais vérifier dès maintenant.
a ajouté 2:
I essayé de modifier le code pour le contrôleur. Il n'a pas aidé:
private Thread controller = new Thread() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().add(generatePartnerSelectionPanel());
frame.invalidate();
frame.validate();
}
});
}
};
3 AJOUTÉE:
OK. Voici la version complète du code (ce qui ne fonctionne pas):
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.event.*;
import java.awt.*;
public class GameWindow {
private String[] players;
private JFrame frame;
// Constructor.
public GameWindow(String[] players) {
this.players = players;
}
// Start the window in the EDT.
public void start() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showWindow();
controller.start();
}
});
}
// Defines the general properties of and starts the window.
public void showWindow() {
frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,400);
frame.setVisible(true);
}
// The thread controlling changes of panels in the main window.
private Thread controller = new Thread() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().add(generatePartnerSelectionPanel());
frame.invalidate();
frame.validate();
}
});
}
};
// Generate the panel for the selection of a partner.
private JPanel generatePartnerSelectionPanel() {
JPanel panel = new JPanel();
panel.add(new JLabel("Pleas select a partner:"));
return panel;
}
}
4 AJOUTÉE:
Le code suivant ne fonctionne pas non plus. Par ailleurs, pourquoi devrais-je supprimer invokeLater
du start
? J'ai besoin de démarrer l'interface graphique dans le fil d'expédition de l'événement et invokelater
le fait.
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.event.*;
import java.awt.*;
public class GameWindow {
private String[] players;
private JFrame frame;
// Constructor.
public GameWindow(String[] players) {
this.players = players;
}
// Start the window in the EDT.
public void start() {
// SwingUtilities.invokeLater(new Runnable() {
// public void run() {
showWindow();
controller.start();
// }
// });
}
// Defines the general properties of and starts the window.
public void showWindow() {
frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,400);
frame.setVisible(true);
}
// The thread controlling changes of panels in the main window.
private Thread controller = new Thread() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().add(generatePartnerSelectionPanel());
frame.invalidate();
frame.validate();
}
});
}
};
// Generate the panel for the selection of a partner.
private JPanel generatePartnerSelectionPanel() {
JPanel panel = new JPanel();
panel.add(new JLabel("Pleas select a partner:"));
return panel;
}
}
5 AJOUTÉE:
J'ai résolu le problème.
- Dans la classe j'ai eu
start
etshowWindow
méthodes. Du programme principal j'ai appelé la mauvaise méthode (showWindow
au lieu dustart
). Donc, je remplace la méthodestart
(pour éviter les confusions avec le début du thread), puis j'ai appeléstartWindow
de la classe principale et cela a résolu le problème.
re: votre mise à jour. Avez-vous changé 'start' comme je l'ai suggéré? – Randolpho
Vous devez toujours supprimer l'appel 'invokelater' de votre méthode' start'. – Randolpho
Oui, j'ai supprimé le 'invokeLater'. Le code ne fonctionne toujours pas.En passant, je pense que je ne devrais pas supprimer le 'invokeLater' depuis le début car il démarre l'interface graphique dans le fil d'expédition de l'événement (comme il se doit). – Roman