[英]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);
}
問題:
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;
}
}
否則,如果您絕對必須以繪畫方式顯示圖像,我建議:
List<BufferedImage>
displayRandomImage()
方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.