gpt4 book ai didi

java - 如何在 JPanel 中使用 paint 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:03 26 4
gpt4 key购买 nike

我正在用 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(...) 中绘图JPanel 的方法并调用正确的 super.paintComponent(...)它内部的方法,如 Swing painting tutorials 中所述,但何必呢。创建一组 ImageIcons 并简单地调用 setIcon(...) 会容易得多在从数组或 ArrayList 中随机选择一个图标后,在 3 个(或您需要的任何数量)JLabel 上。

此外,永远不要这样做:

try {

// .... some code here

} catch (IOException e) {

}

至少打印出 catch block 中的堆栈跟踪,这样您就可以在发生任何 IO 异常时识别它们:

try {

// .... some code here

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

例如,以下代码将生成此 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;
}
}

否则,如果您绝对必须以绘画方式显示图像,我建议:

  • 创建一个仅显示一个图像的 JPanel 扩展类,假设称为 ImageDisplayPanel。如果你需要显示 2 张图片,你将给你的第 2 类。
  • 向其中传递一个 List<BufferedImage>
  • 给它一个displayRandomImage()方法
  • 在这个方法中,从列表中选择一个随机图像并为这个图像设置一个 BufferedImage 字段,然后调用 repaint()。
  • 如果该字段不为空,则 DrawImagePanel 的 paintComponent 方法将绘制该字段持有的图像。
  • 在主 GUI 中,根据需要在 2 或 3 个图像 JPanel 上调用此方法。

关于java - 如何在 JPanel 中使用 paint 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30265637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com