2015-05-15 12 views
6

में पेंट विधि का उपयोग कैसे करें मैं जावा में एक स्लॉट मशीन पर काम कर रहा हूं और अब तक मैंने एक बटन बनाया है जो यादृच्छिक रूप से दो चित्र उत्पन्न करेगा। मेरा कोड संकलित करता है लेकिन जब मैं इसे चलाता हूं, तो पेंट विधि में रखी गई सभी चीज़ें दिखाई नहीं देती हैं। क्या मुझसे कुछ छूट रहा है? आपकी मदद के लिए धन्यवाद और यहां मेरा कुछ कोड है।जेपीनल

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

'स्विंग' से निपटने पर, किसी को इस तरह के कार्य के लिए 'पेंट' विधि के साथ नहीं खेलना चाहिए। पेंटिंग से संबंधित सामान करने के लिए कुछ 'जेकंपोनेंट/जेपीनल' की विधि 'पेंट कॉम्पोनेंट (...)' विधि को ओवरराइड करें। [कस्टम पेंटिंग प्रदर्शन] पर अधिक जानकारी (https://docs.oracle.com/javase/tutorial/uiswing/painting/)। सामान्य समस्याओं को हल करने के लिए पढ़ें, पहली समस्या यह बताएगी कि आप क्या गलत कर रहे हैं। उम्मीद है कि यह मदद करता है :-) –

+1

यिक्स, आपकी 'पेंट' विधि 'super.paintComponents (...)' को करने के लिए एक बहुत ही खतरनाक चीज है।कृपया इस पर पेंटिंग ट्यूटोरियल पढ़ें क्योंकि यह सब बहुत अच्छी तरह समझाया गया है और उपरोक्त @nIcEcOw राज्यों के साथ बिल्कुल सहमत है। खुद, मैं बस जेएलएबल में प्रदर्शित छवि आइकन को स्वैप कर दूंगा। –

+0

कृपया उत्तर देने के लिए संपादित करें देखें। –

उत्तर

4

समस्याएं:

  • आप एक JFrame में सीधे ड्राइंग कर रहे हैं - के रूप में आप गंदगी JFrame ग्राफिक्स कर सकते हैं ऐसा नहीं करते हैं।
  • पेंट विधि को ओवरराइड करना और super.paintComponents(...) विधि को कॉल करना, फिर से करना एक खतरनाक चीज है, और ऐसा कुछ जो कभी नहीं किया जाना चाहिए।

इसके बजाय आप क्यों परेशान एक JPanel की paintComponent(...) विधि में अपने ड्राइंग है और Swing painting tutorials में वर्णित के रूप में यह के अंदर सही super.paintComponent(...) विधि कॉल, है, लेकिन हो सकता है। ImageIcons की एक सरणी बनाना बहुत आसान होगा और सरणी या ArrayList से यादृच्छिक रूप से आइकन चुनने के बाद, केवल 312 (या हालांकि आपको बहुत जरूरत है) JLabels पर setIcon(...) पर कॉल करें।

इसके अलावा, यह करने के लिए कभी नहीं:

try { 

    // .... some code here 

} catch (IOException e) { 

} 

कम से कम बाहर पकड़ ब्लॉक के भीतर स्टैक ट्रेस प्रिंट ताकि आप किसी भी IO अपवाद की पहचान कर सकते हैं अगर वे होते हैं:

try { 

    // .... some code here 

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

के लिए उदाहरण के लिए, निम्नलिखित कोड इस जीयूआई का उत्पादन करेगा:

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; 
    } 
} 

अन्यथा यदि आप पूरी तरह से एक पेंटिंग विधि में छवियों को प्रदर्शित करना होगा, मैं सलाह देते हैं:

  • एक JPanel विस्तार वर्ग कि सिर्फ एक छवि, ImageDisplayPanel बुलाया कहना प्रदर्शित करता है बनाएँ। यदि आपको 2 छवियां प्रदर्शित करने की आवश्यकता है तो आप इन्हें अपनी कक्षा 2 देंगे।
  • पास इसे में एक List<BufferedImage>
  • यह एक displayRandomImage() विधि
  • दें इस विधि में, सूची से एक यादृच्छिक छवि का चयन करें और इस छवि के लिए एक BufferedImage क्षेत्र निर्धारित करते हैं, और रीपेंट फोन()।
  • DrawImagePanel की पेंटकंपोनेंट विधि फ़ील्ड द्वारा आयोजित छवि को खींचा जाएगा यदि यह शून्य नहीं है।
  • मुख्य जीयूआई में, इस विधि को अपनी 2 या 3 छवि जेपीनेल पर आवश्यकतानुसार कॉल करें।
+0

आपकी मदद के लिए धन्यवाद, मैं आपकी सलाह का पालन करने की कोशिश करूंगा जितना मैं कर सकता हूं! –

संबंधित मुद्दे