繁体   English   中英

如何在JPanel中使用paint方法

[英]How to use paint method in a JPanel

我正在使用Java开发老虎机,到目前为止我创建了一个随机生成两张图片的按钮。 我的代码编译但是当我运行它时,我在paint方法中放入的所有东西都没有显示出来。 有什么我想念的吗? 感谢您的帮助,这是我的一些代码。

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

问题:

  • 你直接在JFrame中绘图 - 不要这样做,因为你可以弄乱JFrame图形。
  • 你重写paint方法并调用super.paintComponents(...)方法,这也是一件危险的事情,也是一件永远不应该做的事情。

相反,您可以paintComponent(...)方法中进行绘制,并在其中调用正确的super.paintComponent(...)方法,如Swing绘画教程中所述 ,但为什么要这么麻烦。 更简单的是创建一个ImageIcons数组,并在从数组或ArrayList中随机选择一个Icon之后简单地在3(或者你需要多少)JLabel上调用setIcon(...)

此外,永远不要这样做:

try {

  // .... some code here

} catch (IOException e) {

}

至少打印出catch块中的堆栈跟踪,以便在发生任何IO异常时识别它们:

try {

  // .... some code here

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

例如,以下代码将生成此GUI:

在此输入图像描述

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字段,然后调用repaint()。
  • 如果字段不为null,DrawImagePanel的paintComponent方法将绘制字段所保留的图像。
  • 在主GUI中,根据需要在2或3个图像JPanel上调用此方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM