2015-05-15 13 views
6

Ich arbeite an einem Spielautomaten in Java und bis jetzt habe ich eine Schaltfläche erstellt, die nach dem Zufallsprinzip zwei Bilder erzeugen wird. Mein Code wird kompiliert, aber wenn ich ihn ausführe, erscheinen nicht alle Sachen, die ich in die Malmethode eingegeben habe. Gibt es etwas, was mir fehlt? Danke für deine Hilfe und hier ist ein Teil meines Codes.Wie verwende ich die Malmethode in einem JPanel

public void paint(Graphics g) { 
     super.paintComponents(g); 
     g.drawString("Int 1 is" + int1,30,30); 
     g.drawString("Int 2 is" + int2,30,80); 
     switch (int1) { 
      case 0: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img, 300, 500, this); 
       break; 
      case 1: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img2,300,500,this); 
       break; 
      case 2: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img3,300,500,this); 
       break; 
      case 3: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img4,300,500,this); 
       break; 
      case 4: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img5,300,500,this); 
       break; 
      case 5: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img6,300,500,this); 
       break; 
      case 6: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img7,300,500,this); 
       break; 
      case 7: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img8,300,500,this); 
       break; 
      case 8: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img9,300,500,this); 
       break; 
      case 9: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img10,300,500,this); 
       break; 
     } 
     switch (int2) { 
      case 0: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img, 800, 500, this); 
       break; 
      case 1: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img2,800,500,this); 
       break; 
      case 2: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img3,800,500,this); 
       break; 
      case 3: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img4,800,500,this); 
       break; 
      case 4: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img5,800,500,this); 
       break; 
      case 5: 
\    g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img6,800,500,this); 
       break; 
      case 6: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img7,800,500,this); 
       break; 
      case 7: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img8,800,500,this); 
       break; 
      case 8: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img9,800,500,this); 
       break; 
      case 9: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img10,800,500,this); 
       break; 
     } 
     this.setVisible(true); 
    } 
+1

Wenn man sich mit 'Swing' beschäftigt, sollte man nicht mit der' paint' Methode für eine solche Aufgabe spielen. Stattdessen überschreiben Sie die 'paintComponent (...)' Methode von 'JComponent/JPanel', um die damit verbundenen Dinge zu tun. Weitere Informationen finden Sie unter [Durchführen von benutzerdefinierten Bildern] (https://docs.oracle.com/javase/tutorial/uiswing/painting/). Lesen Sie die allgemeinen Probleme zu lösen, wird das erste Problem beantworten, was Sie falsch machen. Hoffe es hilft :-) –

+1

Huch, deine 'Paint' Methode nennt' super.paintComponents (...) 'eine sehr gefährliche Sache.Bitte lesen Sie die Tutorials dazu, da alles sehr gut erklärt ist und stimmt genau mit dem überein, was @nICecOw oben sagt. Ich würde einfach ImageIcons austauschen, die in einem JLabel angezeigt werden. –

+0

Bitte bearbeite die Antwort. –

Antwort

4

Probleme:

  • Sie sind direkt in einem JFrame Zeichnung - tun dies nicht, wie Sie können die JFrame Grafiken vermasseln.
  • Ihr Override der Malmethode und Aufruf der Methode, wieder eine gefährliche Sache zu tun, und etwas, das nie getan werden sollte.

Sie stattdessen Ihre Zeichnung eines JPanel in der paintComponent(...) Methode tun konnte, und die richtige super.paintComponent(...) Methode in der es nennen, wie sie in der Swing painting tutorials beschrieben, aber warum die Mühe. Viel einfacher wäre es, ein Array von ImageIcons zu erstellen und einfach setIcon(...) auf 3 (oder wie viele Sie benötigen) JLabels aufzurufen, nachdem Sie zufällig ein Icon aus dem Array oder der ArrayList ausgewählt haben.

Auch dies nie tun:

try { 

    // .... some code here 

} catch (IOException e) { 

} 

Mindestens drucken, so aus dem Stack-Trace in der catch-Block Sie IO Ausnahmen identifizieren können, wenn sie auftreten:

try { 

    // .... some code here 

} catch (IOException e) { 
    e.printStackTrace(); // ****** added ********  
} 

Für Beispiel: Der folgende Code erzeugt diese GUI:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
// extend JPanel, not JFrame as it gives the class more flexibility as to where to use 
public class ShowRandomImages extends JPanel { 
    // images from Andrew Thompson's example image page, 
    // http://stackoverflow.com/questions/19209650/example-images-for-code-and-mark-up-qas 
    private static final String IMAGE_SHEET_PATH = "http://i.stack.imgur.com/memI0.png"; 
    // how many JLabels to show in a row 
    private static final int LABEL_COUNT = 3; 
    // need to get subimages from image sheet. There are 6 columns in the sheet 
    private static final int IMAGE_COLUMNS = 6; 
    // array of JLabel 
    private JLabel[] labels = new JLabel[LABEL_COUNT]; 
    // hold all the images as ImageIcons read in 
    private List<Icon> imageIconList = new ArrayList<>(); 
    // to randomize the images 
    private Random random = new Random(); 

    // pass the ImageIcon List into this class 
    public ShowRandomImages(List<Icon> iconList) { 
     this.imageIconList = iconList; 
     // jpanel hold row of image-displaying JLabels 
     JPanel labelHolderPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     for (int i = 0; i < labels.length; i++) { // create all JLabels in array 
     labels[i] = new JLabel(); 
     labels[i].setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); 
     labels[i].setHorizontalAlignment(SwingConstants.CENTER); // center the icon 
     labels[i].setIcon(getRandomIcon()); // initialize with a random image 
     labelHolderPanel.add(labels[i]); // add to holder JPanel 
     } 

     // panel to hold button at bottom 
     JPanel bottomPanel = new JPanel(); 
     // button uses an AbstractAction rather than an ActionListener 
     bottomPanel.add(new JButton(new ShowRandomIconAction("Show Random Image"))); 

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BorderLayout()); 
     add(labelHolderPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    private Icon getRandomIcon() { 
     int randomIndex = random.nextInt(imageIconList.size()); 
     return imageIconList.get(randomIndex); 
    } 

    private class ShowRandomIconAction extends AbstractAction { 
     public ShowRandomIconAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     for (JLabel jLabel : labels) { 
      jLabel.setIcon(getRandomIcon()); 
     } 
     } 
    } 

    private static void createAndShowGui(List<Icon> imageIconList) { 
     ShowRandomImages mainPanel = new ShowRandomImages(imageIconList); 

     JFrame frame = new JFrame("ShowRandomImages"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     try { 
     final List<Icon> iconList = getImages(); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(iconList); 
      } 
     }); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 

    // read in image sheet and extract sub-images from it 
    private static List<Icon> getImages() throws IOException { 
     List<Icon> iconList = new ArrayList<>(); 
     URL imageUrl = new URL(IMAGE_SHEET_PATH); 
     BufferedImage imageSheet = ImageIO.read(imageUrl); 
     for (int i = 0; i < IMAGE_COLUMNS; i++) { 
     int x = (int) ((double) i * imageSheet.getWidth()/IMAGE_COLUMNS); 
     int y = 0; 
     int w = imageSheet.getWidth()/IMAGE_COLUMNS; 
     int h = imageSheet.getHeight()/2; 

     BufferedImage subImage = imageSheet.getSubimage(x, y, w, h); 
     iconList.add(new ImageIcon(subImage)); 
     } 
     return iconList; 
    } 
} 

Andernfalls, wenn Sie absolut Bilder in einer Malweise anzuzeigen muss, würde ich empfehlen:

  • erstellen JPanel erstreckt Klasse, die nur ein Bild anzeigt, sagen genannt ImageDisplayPanel. Sie geben Ihre Klasse 2, wenn Sie 2 Bilder anzeigen müssen.
  • Pass in sie ein List<BufferedImage>
  • ihm eine In diesem Verfahren
  • displayRandomImage() Methode Geben, ein zufälliges Bild aus der Liste auswählen und ein BufferedImage Feld zu diesem Bild gesetzt, und ruft repaint().
  • Die paintComponent-Methode von DrawImagePanel zeichnet das vom Feld gehaltene Bild, wenn es nicht null ist.
  • Rufen Sie diese Methode im Haupt-GUI auf Ihren 2 oder 3 Bild-JPanels nach Bedarf auf.
+0

Vielen Dank für Ihre Hilfe, ich werde versuchen, Ihrem Rat so gut wie möglich zu folgen! –