2016-05-28 3 views
0

Ich habe eine Benutzeroberfläche im Screenshot erstellt. Ich initialisiere zu viele JPanel s innerhalb eines Panels in meinem Code, um die UI zu erreichen, die zu schlechtem Code-Design und langsamer Leistung führen wird.UI-basiertes Memory-Spiel

Gibt es irgendwelche guten Praktiken beim Schreiben einer solchen UI?

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingConstants; 


public class GameUI extends JFrame { 

    static JLabel blankCardLabel; 
    static JLabel cardOne; 
    JLabel cardTwo; 
    JLabel cardThree; 
    JLabel cardFour; 
    JLabel cardFive; 
    JLabel cardSix; 
    JLabel cardSeven; 
    JLabel cardEight; 
    JLabel cardNine; 
    JLabel cardTen; 
    JLabel cardEleven; 
    JLabel cardTwelve; 
    JLabel cardThirteen; 
    JLabel cardFourteen; 
    BufferedImage blankCardPic; 
    JLabel deck; 
    BufferedImage revealCardPic; 
    JPanel eastPanel; 
    JPanel southPanel; 
    JPanel messagePanel; 
    JPanel cardPanel; 
    BoxLayout eastPanelBL; 
    BoxLayout southPanelBL; 
    BoxLayout cardPanelBL; 
    JLabel playerOne = new JLabel("Player One"); 
    JLabel playerTwo = new JLabel("Player Two"); 
    JLabel playerThree = new JLabel("Player Three"); 
    JLabel playerFour = new JLabel("Player Four"); 
    JLabel c; 
    public GameUI() { 
     setLayout(new BorderLayout()); 

     add(new JLabel("Memory Game", SwingConstants.CENTER), BorderLayout.NORTH); 
     /*cardOne = new JLabel("One"); 
     cardTwo = new JLabel("Two"); 
     cardThree = new JLabel("Three"); 
     cardFour = new JLabel("Four"); 
     cardFive = new JLabel("Five"); 
     cardSix = new JLabel("Six"); 
     cardSeven = new JLabel("Seven"); 
     cardEight = new JLabel("Eight"); 
     cardNine = new JLabel("Nine"); 
     cardTen = new JLabel("Ten"); 
     cardEleven = new JLabel("Eleven"); 
     cardTwelve = new JLabel("Twelve"); 
     cardThirteen = new JLabel("Thirteen"); 
     cardFourteen = new JLabel("Fourteen");*/ 

     deck = new JLabel(new ImageIcon(blankCard())); 
     cardOne = new JLabel(new ImageIcon(blankCard())); 
     cardTwo = new JLabel(new ImageIcon(blankCard())); 
     cardThree = new JLabel(new ImageIcon(blankCard())); 
     cardFour = new JLabel(new ImageIcon(blankCard())); 
     cardFive = new JLabel(new ImageIcon(blankCard())); 
     cardSix = new JLabel(new ImageIcon(blankCard())); 
     cardSeven = new JLabel(new ImageIcon(blankCard())); 
     cardEight = new JLabel(new ImageIcon(blankCard())); 
     cardNine = new JLabel(new ImageIcon(blankCard())); 
     cardTen = new JLabel(new ImageIcon(blankCard())); 
     cardEleven = new JLabel(new ImageIcon(blankCard())); 
     cardTwelve = new JLabel(new ImageIcon(blankCard())); 
     cardThirteen = new JLabel(new ImageIcon(blankCard())); 
     cardFourteen = new JLabel(new ImageIcon(blankCard())); 


     cardPanel = new JPanel(); 
     cardPanelBL = new BoxLayout(cardPanel, BoxLayout.Y_AXIS); 
     cardPanel.setLayout(cardPanelBL); 

     JPanel topRowPanel = new JPanel(); 

     //cardPanel.add(deck); 
     //c= new JLabel("Card Left In deck",SwingConstants.CENTER); 
     //cardPanel.add(c); 

     topRowPanel.add(cardOne); 
     topRowPanel.add(cardTwo); 
     topRowPanel.add(cardThree); 
     topRowPanel.add(cardFour); 
     topRowPanel.add(cardFive); 
     topRowPanel.add(cardSix); 
     topRowPanel.add(cardSeven); 
     cardPanel.add(topRowPanel); 

     JPanel bottomRowPanel = new JPanel(); 
     bottomRowPanel.add(cardEight); 
     bottomRowPanel.add(cardNine); 
     bottomRowPanel.add(cardTen); 
     bottomRowPanel.add(cardEleven); 
     bottomRowPanel.add(cardTwelve); 
     bottomRowPanel.add(cardThirteen); 
     bottomRowPanel.add(cardFourteen); 
     cardPanel.add(bottomRowPanel); 


     add(cardPanel,BorderLayout.CENTER); 
     //cardOne.setBounds(50,50,50,50); 
     eastPanel = new JPanel(); 
     eastPanelBL = new BoxLayout(eastPanel, BoxLayout.Y_AXIS); 
     eastPanel.setLayout(eastPanelBL); 
     eastPanel.add(Box.createRigidArea(new Dimension(0, 20))); 
     eastPanel.add(playerOne); 
     eastPanel.add(Box.createRigidArea(new Dimension(0, 5))); 
     eastPanel.add(playerTwo); 
     eastPanel.add(Box.createRigidArea(new Dimension(0, 5))); 
     eastPanel.add(playerThree); 
     eastPanel.add(Box.createRigidArea(new Dimension(0, 5))); 
     eastPanel.add(playerFour); 
     add(eastPanel, BorderLayout.EAST); 
     southPanel = new JPanel(new BorderLayout()); 
     southPanel.add(new JTextArea(10,10),BorderLayout.CENTER); 
     messagePanel = new JPanel(new BorderLayout()); 
     messagePanel.add(new JTextField(10),BorderLayout.CENTER); 
     messagePanel.add(new JButton("Send"),BorderLayout.EAST); 
     southPanel.add(messagePanel,BorderLayout.SOUTH); 
     add(southPanel, BorderLayout.SOUTH);   

     //add(cardOne); 
     //cardOne.setText("ClubsAce.png"); 

     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     pack(); 
     setSize(1024,768); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new GameUI(); 
    } 

    public BufferedImage blankCard() { 
     try { 
      blankCardPic = ImageIO.read(new File("resources/images/blank.png")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return blankCardPic; 
    } 

    /*public static BufferedImage revealCard(String s) { 
     try { 
      revealCardPic = ImageIO.read(new File("resources/images/"+s)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return revealCardPic; 
    }*/ 
} 
+0

Ich glaube nicht, dass ein paar JPanels wirklich die Leistung beeinträchtigen können ... Was das Code-Design betrifft, schlage ich vor, dass Sie eine Reihe von JPanels verwenden, statt 14 eine für 14 und eine statt 4 für Spieler. – Rtoip

+1

* "Gibt es irgendwelche guten Praktiken beim Schreiben solch einer UI?" * Dies wird wahrscheinlich als 'meinungsbasiert' geschlossen, aber meine Meinung .. Stoppen Sie, bevor Sie 10.000 Sub-Panels erreichen. Und selbst dann, führen Sie es durch einen Profiler, bevor Sie handeln. Ernsthaft, das ist [vorzeitige Optimierung] (https://en.wikipedia.org/wiki/Program_optimization) .. –

+2

'public BufferedImage BlankCard() { Versuch { blankCardPic = ImageIO.read (neue Datei (" Ressourcen/Bilder /blank.png "));' Diese Methode wird mehrmals aufgerufen und ist daher ziemlich ineffizient. Ein besserer Ansatz (weiterhin mit der Methode) besteht darin, die 'blankCardPic' für' null' zu testen und nur zu versuchen, sie zu laden, wenn sie es ist, ansonsten einfach zurückgeben. –

Antwort

0

Wenn Sie zu viel haben ‚JPanel oder des‘ JLabel oder des ‚JButton ist .... das Beste denken, dass Sie tun können, ist, dass Sie Array davon erstellen können. Und in for-Schleife können Sie es in nur wenigen Zeilen Code erstellen.