2015-11-02 1 views
0

Je vais poster à nouveau ceci et essayer d'être plus précis et succinct cette fois-ci. J'ai installé WindowBuilder et l'ai utilisé pour générer mon code GUI.JLabel et JPanel - Dynamiquement en utilisant une interface graphique pour afficher des images différentes

J'ai donc mon interface graphique et tout ce qui se passe. WindowBuilder crée automatiquement une méthode appelée initialize() et c'est là que tout mon code GUI est.

J'ai copié beaucoup de mon code. Je pense que j'ai tout laissé pour identifier ce que j'essaie de faire.

Je ne suis pas sûr si le code ci-dessous fonctionne, étant expurgée et tout, mais en général, chaque fois que l'utilisateur clique sur le bouton « ROLL » sur l'interface graphique, il doit exécuter la rolldice() méthode, qui cycles un côté d'un dé pendant .1 secondes chacun, et enfin l'arrêt et l'atterrissage sur la valeur finale.

J'ai essayé comme une folle d'implémenter une méthode pour cela, mais tout ce que je fais concernant l'interface graphique en dehors de la classe initialize() ne fonctionne pas du tout - mais ne renvoie aucune erreur dans mon code . Toute aide serait appréciée!

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.Font; 
import java.awt.Image; 
import java.awt.Label; 

import javax.swing.JScrollPane; 
import javax.swing.JPanel; 
import javax.swing.JOptionPane; 
import java.util.*; 
import javax.swing.JComboBox; 
import java.awt.Color; 
import javax.swing.SwingConstants; 

public class PigDice { 
public JFrame frame; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       PigDice window = new PigDice(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
}//Main Method 

static void diceTumble(){ 

} 

static void pausee(int x){ 
    try { 
     Thread.sleep(x); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}//endsPause 

/** 
* Create the application. 
*/ 
public PigDice() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 

    frame = new JFrame(); 
    frame.setBounds(100, 100, 1038, 892); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JPanel panel = new JPanel(); 
    panel.setBounds(0, 0, 1016, 830); 
    frame.getContentPane().add(panel); 
    panel.setLayout(null); 

    JButton btnRoll = new JButton("Roll"); 
    btnRoll.setFont(new Font("Tahoma", Font.BOLD, 24)); 
    btnRoll.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      tumbleDice(); 
     } 
    }); 
    btnRoll.setBounds(292, 639, 135, 52); 
    panel.add(btnRoll); 

} 

static void tumbleDice(){ 
    for(int i = 0; i < 25; i++){ 
     sleep(100); 

     JPanel panel_1 = new JPanel();//panel for dice1 
     panel_1.setBounds(277, 393, 150, 150); 
     panel.add(panel_1); 
     panel_1.setLayout(null); 

     JPanel panel_2 = new JPanel();//panel for dice2 
     panel_2.setBounds(564, 393, 150, 150); 
     panel.add(panel_2); 
     panel_2.setLayout(null); 

     JLabel dice1 = new JLabel("dice1"); 
     dice1.setHorizontalAlignment(SwingConstants.CENTER); 
     dice1.setBounds(0, 0, 150, 150); 
     Image die1 = new ImageIcon(this.getClass().getResource("" + tumble())).getImage(); 
     dice1.setIcon(new ImageIcon(die1)); 
     panel_1.add(dice1); 

     JLabel dice2 = new JLabel("dice2"); 
     dice2.setHorizontalAlignment(SwingConstants.CENTER); 
     dice2.setBounds(0, 0, 150, 150); 
     Image die2 = new ImageIcon(this.getClass().getResource("" + tumble())).getImage(); 
     dice2.setIcon(new ImageIcon(die2)); 
     panel_2.add(dice2); 
    }//for loop 
}//tumbleDice method 

String tumble(){ 
    int random = (int) (Math.random() * 6) + 1; 
    if(random == 1) 
     return "/side1.png"; 
    if(random == 2) 
     return "/side2.png"; 
    if(random == 3) 
     return "/side3.png"; 
    if(random == 4) 
     return "/side4.png"; 
    if(random == 5) 
     return "/side5.png"; 
    return "/side6.png"; 
} 
}//end PigDice 

Répondre

0
  1. Ne pas continuer à créer de nouveaux composants. Si vous voulez changer l'image, utilisez simplement la méthode setIcon() du JLabel.

  2. N'utilisez pas une disposition nulle. Swing a été conçu pour être utilisé avec les gestionnaires de disposition.

  3. N'utilisez pas Thread.sleep(). Cela provoque le thread Event Dispatch Thread qui signifie que l'interface graphique ne peut pas se repeindre. Au lieu de cela, utilisez un Swing Timer.

Le Swing Tutorial a des exemples de toutes ces suggestions lire ainsi le tutoriel pour les bases.

De même, ne lisez pas continuellement les fichiers d'image. Ce n'est pas très efficace si vous allez boucler 25 fois. Au lieu de cela, les images doivent être chargées dans le constructeur de votre classe. Alors peut-être les stocker dans un ArrayList et juste retourner l'index aléatoire de l'icône que vous voulez afficher dans l'étiquette.

+0

Je jetterai un coup d'œil sur Swing Timer et je regarderai dans setIcon de plus, ça sonne comme un très bon conseil! Que dois-je faire au lieu de mettre null à l'intérieur alors? –

+0

Je vous avais déjà suggéré d'utiliser "layout managers". Le tutoriel contient des exemples de travail. Je suggère un simple FlowLayout est un bon endroit pour commencer à afficher deux dés. – camickr