redimensionner JFrame automatiquement avec un Composite Java
Je suis en œuvre des changements à une partie de démineur. L'une de ces choses est la difficulté. J'ai réussi à le faire et son travail, mais que le jeu conseil d'administration (dans sa propre Composite) est plus grand & les plus petites (selon la difficulté), je ne peux pas obtenir la JFrame pour redimensionner automatiquement. Je suis à l'aide de:
setPreferredSize(new Dimension(WIDTH, HEIGHT));
pour définir la taille initiale de la fenêtre, mais cela le rend VRAIMENT minuscule, en indiquant uniquement le mot "Fichier" de la JMenuBar. Je dois la redimensionner manuellement.
J'ai essayé setSize() et des choses comme cadre.pack() sur l'ActionListener événement, mais je n'arrive pas à l'obtenir à redimensionner.
Des conseils sur ce code, les méthodes à utiliser.
edit: le code posté
package mines;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class SetupFrame extends JFrame {
private final int WIDTH = 600;
private final int HEIGHT = 500;
public JFrame frame;
public JMenuBar menubar;
public JMenu file;
public JMenu levels;
public JMenu help;
public JMenuItem login;
public JMenuItem save;
public JMenuItem resume;
public JMenuItem exit;
public JMenuItem easy;
public JMenuItem medium;
public JMenuItem hard;
private JLabel statusbar;
public JPanel main;
public JPanel buttonPanel;
public JPanel saved;
public JPanel game;
public Board mineGame;
public JButton ngButton;
public JButton undoButton;
public JButton redoButton;
public JTabbedPane tp;
public String[] levelPicker;
public JComboBox levelSelect;
public JFileChooser chooser;
public String filename;
public int difficulty;
public SetupFrame(){
frame = new JFrame();
String filename = JOptionPane.showInputDialog(frame, "Enter Your Name.");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setTitle("Minesweeper");
//menubar, menus, menu items
menubar = new JMenuBar();
setJMenuBar(menubar);
file = new JMenu("File");
help = new JMenu("Help");
menubar.add(file);
menubar.add(help);
login = new JMenuItem("Login..");
save = new JMenuItem("Save..");
resume = new JMenuItem("Resume..");
exit = new JMenuItem("Exit");
file.add(login);
file.add(save);
file.add(resume);
file.addSeparator();
file.add(exit);
statusbar = new JLabel("");
chooser = new JFileChooser(); //new File Chooser for saved tab
undoButton = new JButton(" Undo "); //undo Button for game panel
ngButton = new JButton(" New Game ");//new game Button for game panel
redoButton = new JButton(" Redo");//redo Button for game panel
main = new JPanel(new BorderLayout()); //new panel for main game
//main.add(mineGame, BorderLayout.CENTER); //add instance mineGame to main panel
game = new JPanel(new BorderLayout());//new panel for game tab
main.add(game, BorderLayout.CENTER); //add the mineGames panel to game panel
game.add(statusbar, BorderLayout.SOUTH); //add statusbar to bottom of game panel
//game.add(button, BorderLayout.NORTH); //add buttons (eventually be redo, undo, new game)
saved = new JPanel(); //create new panel for the saved tab
saved.add(chooser);//add the File Chooser to the saved tab
String[] levelPicker = {"Easy", "Medium", "Hard"};
levelSelect = new JComboBox(levelPicker);
levelSelect.setSelectedIndex(0);
//levelSelect.addActionListener(this);
buttonPanel = new JPanel();
buttonPanel.add(undoButton);
buttonPanel.add(ngButton);
buttonPanel.add(redoButton);
buttonPanel.add(levelSelect);
main.add(buttonPanel, BorderLayout.NORTH);
//create & add the tabs
tp = new JTabbedPane();
tp.addTab ("Game", main);
tp.addTab ("Saved", saved);
tp.addTab ("Statistics", null);
add(tp);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setResizable(true);
setVisible(true);
frame.pack();
class listener implements ActionListener{
public void actionPerformed (ActionEvent e)
{
if(e.getSource() == ngButton){
//JOptionPane.showInputDialog(frame, "Do You want To Save");
newMineGame();
}
JComboBox cb = (JComboBox)e.getSource();
String picker = (String)cb.getSelectedItem();
if (picker == "Easy"){
difficulty = 0;
newMineGame();
}
if (picker == "Medium"){
difficulty = 1;
newMineGame();
frame.pack();
}
if (picker == "Hard"){
difficulty = 2;
newMineGame();
frame.pack();
}
}
private void newMineGame() {
game.removeAll();
mineGame = new Board(statusbar, difficulty);
game.add(mineGame, BorderLayout.CENTER);
game.add(statusbar, BorderLayout.SOUTH);
repaint();
}
}
ngButton.addActionListener(new listener());
undoButton.addActionListener(new listener());
redoButton.addActionListener(new listener());
levelSelect.addActionListener(new listener());
}
public static void main(String[] args) {
new SetupFrame();
}
En outre, êtes-vous à l'aide de la méthode sur le Composite ou la JFrame?
À l'aide de
validate();
ou revalidate();
tend à "rafraîchir" la JFrame/Composite - avez-vous essayé d'utiliser ces?utilisation CardLayout comme la plus simple des façons possibles
Pour mieux aider plus tôt, après une SSCCE. Voir le Imbriqués Exemple de Disposition pour un exemple de travail de redimensionnement sur PLAF changement.
OriginalL'auteur Ange King | 2013-10-04
Vous devez vous connecter pour publier un commentaire.
et
JFrame.pack()
œuvres dans le casque tous les
JComponents
représentant des mines (il y a de meilleures façons d'utiliserJToggleButton
) renvoie correctementPreferredSize
de retour à son parent (JPanel
)parent (Composite) posée par GridLayout (très simple)
et il y a deux façons de savoir comment, quand, où
JFrame.pack()
utilisation
CardLayout
, la prochaine ligne de code après la commutationCard
estJFrame.pack()
supprimer les vieux
JPanel
(à partir deJFrame
) et les remplacer par de nouvelles, alors vous devez faire appelJFrame.(re)validate()
,JFrame.repaint()
etJFrame.pack()
que les dernières lignes de codepeut-être il y a un autre problème, l'important c'est le code de la commande dans le cas qui est là paramètres pour
JFrame.setResizable(false);
après votre modifier
utilisation Cardlayout
il vous manque des lignes de code (ne pas s'étend
JFrame
, créer cet Objet commeLocal variable
)JFrame.(re)validate()
,JFrame.repaint()
etJFrame.pack()
que les dernières lignes de code dansprivate void newMineGame() {
code pourrait être
supprimer
extends JFrame
depublic class SetupFrame extends JFrame {
, parce qu'il y a deuxJFrame
s, l'un d'eux n'est jamais visible, et à ceJFrame
sont apportées les modifications, vous devez ajouterframe.
avant chaquesetXxxXxx
etadd()
, dansIDE
il y a des avertissements rougeJe vous remercie. J'ai fait les changements, mais malheureusement, la JFrame est pas encore le redimensionnement :-(.
tout est venu du Conseil d'administration, supprimer tous les paramètres pour H & W, remplacer set/getPreferredSize pour la 1ère. élément de la grille, la note doit être prévu par la Grille(Sac)de la Mise en page, il n'est pas nécessaire de toutes les paramètre pour setSize, setPreferredSize pour l'un de ses parents, par exemple, Composite, JFrame, etc.
OriginalL'auteur mKorbel
Ici est de votre faute:
Pourquoi avez-vous besoin
frame
si votreSetupFrame
s'étend en fait à partir deJFrame
? Remplacez cette ligne par simplementpack()
et il va fonctionner.@mKorbel déjà posté un complet et très utile explication sur
pack()
comportement (merci).Mise à jour
Également dans votre
listener
classe que vous obtiendrez de cette exception lors d'unJButton
est pressé:Vous avez besoin de faire ce petit changement pour éviter cela:
Ou encore mieux, de mettre en œuvre un ItemListener pour écouter
JComboBox
les changements de la sélection au lieu d'utiliser unActionListener
Êtes-vous sûr? J'ai juste fait ce changement et cela a fonctionné comme un charme pour moi. Je n'ai pas
Board
classe pour tester le comportement lorsque le niveau de difficulté des changements. Veuillez voir le jour réponse, j'ai trouvé un petit bug.Merci pour l'astuce. J'ai changé le code, et j'ai vu mon erreur de l'ajout d'un autre cadre. elle n'est pas toujours redimensionner sur le changement de niveau de difficulté, je vais donc regarder dans le ItemListener.
fonctionne très bien.... +1
OriginalL'auteur dic19