2015-05-15 37 views
6

Sto lavorando su una slot machine in Java e finora ho creato un pulsante che genera in modo casuale due immagini. Il mio codice viene compilato ma quando lo eseguo, tutte le cose che ho inserito nel metodo paint non vengono visualizzate. C'è qualcosa che mi manca? Grazie per il tuo aiuto ed ecco parte del mio codice.Come utilizzare il metodo di vernice in un 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

Quando si tratta di 'Swing', non si dovrebbe giocare con' metodo paint' per un tale compito. Invece di sovrascrivere il metodo 'paintComponent (...)' di alcuni 'JComponent/JPanel' per fare le cose relative alla pittura. Maggiori informazioni su [Esecuzione di disegni personalizzati] (https://docs.oracle.com/javase/tutorial/uiswing/painting/). Leggi la risoluzione dei problemi comuni, il primo problema risponderà a ciò che stai facendo male. Spero sia utile :-) –

+1

Yikes, il tuo metodo 'paint' chiama' super.paintComponents (...) 'una cosa molto pericolosa da fare.Si prega di leggere le esercitazioni di pittura su questo come è tutto spiegato molto bene e concorda esattamente con ciò che @nIcEcOw afferma sopra. Mi piacerebbe semplicemente scambiare ImageIcons visualizzati in una JLabel. –

+0

Vedere la modifica per rispondere. –

risposta

4

Problemi:

  • si sta disegnando direttamente in un JFrame - non fanno questo, come si può rovinare la grafica JFrame.
  • tuo override del metodo vernice e chiamando il metodo super.paintComponents(...), ancora una volta una cosa pericolosa da fare, e qualcosa che non dovrebbe mai essere fatto.

Invece si potrebbe fare il vostro disegno nel metodo di un JPanel paintComponent(...) e chiamare il metodo corretto super.paintComponent(...) all'interno di esso, come descritto nel Swing painting tutorials, ma perché preoccuparsi. Molto più semplice sarebbe creare una serie di ImageIcons e chiamare semplicemente setIcon(...) su 3 (o comunque molti ne hai bisogno) JLabels, dopo aver selezionato casualmente un'icona dall'array o da ArrayList.

Inoltre, non fare questo:

try { 

    // .... some code here 

} catch (IOException e) { 

} 

Almeno stampare la traccia dello stack all'interno del blocco catch in modo da poter individuare eventuali eccezioni IO se si verificano:

try { 

    // .... some code here 

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

Per ad esempio, il codice seguente produrrà questa 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; 
    } 
} 

caso contrario, se si deve assolutamente visualizzare le immagini in un metodo di pittura, mi consiglia:

  • Creare una classe che estende JPanel che visualizza una sola immagine, diciamo chiamato ImageDisplayPanel. Darai la tua classe 2 di questi se hai bisogno di visualizzare 2 immagini.
  • passano in un List<BufferedImage>
  • dargli un metodo di
  • displayRandomImage() In questo metodo, selezionare un'immagine casuale dall'elenco e impostare un campo BufferedImage a questa immagine, e chiamare repaint().
  • Il metodo paintComponent del DrawImagePanel trarrà l'immagine tenuto dal campo se non è nullo.
  • Nella GUI principale, chiamare questo metodo sugli JPanels delle immagini 2 o 3 secondo necessità.
+0

Grazie per il vostro aiuto, cercherò di seguire il vostro consiglio nel miglior modo possibile! –