public class GamePanel extends JPanel {
private int windowHeight = Toolkit.getDefaultToolkit().getScreenSize().height-37;
private int windowWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
private int height = windowHeight / 6;
private int width = windowWidth;
private BufferedImage bg;
public GamePanel() {
setBounds(0, windowHeight / 5 * 4, windowWidth, windowHeight);
try {bg = ImageIO.read(new File("GUI Images/wood background.png"));}
catch (Exception e) {Utilities.showErrorMessage(this, e);}
setVisible(true);
//add buttons
JButton InventButton = new JButton("Inventory");
InventButton.setOpaque(false);
InventButton.setBorderPainted(false);
InventButton.setContentAreaFilled(false);
InventButton.setVerticalTextPosition(SwingConstants.CENTER);
InventButton.setHorizontalTextPosition(SwingConstants.CENTER);
InventButton.setFont(new Font("TimesRoman", Font.PLAIN, 20));
InventButton.setBounds(width/6*5,0,width/6,height/3);
//get button texture
Image i1 = new ImageIcon("GUI Images/Button.png").getImage().getScaledInstance
(InventButton.getWidth(),InventButton.getHeight(),java.awt.Image.SCALE_SMOOTH);
InventButton.setIcon(new ImageIcon(i1));
InventButton.setForeground(Color.white);
InventButton.addActionListener(e -> {
});
JButton PartyButton = new JButton("Party");
PartyButton.setOpaque(false);
PartyButton.setBorderPainted(false);
PartyButton.setContentAreaFilled(false);
PartyButton.setVerticalTextPosition(SwingConstants.CENTER);
PartyButton.setHorizontalTextPosition(SwingConstants.CENTER);
PartyButton.setFont(new Font("TimesRoman", Font.PLAIN, 20));
PartyButton.setBounds(width/6*5,height/3,width/6,height/3);
PartyButton.setIcon(new ImageIcon(i1));
PartyButton.setForeground(Color.white);
PartyButton.addActionListener(e -> {
});
JButton MenuButton = new JButton("Menu");
MenuButton.setOpaque(false);
MenuButton.setBorderPainted(false);
MenuButton.setContentAreaFilled(false);
MenuButton.setVerticalTextPosition(SwingConstants.CENTER);
MenuButton.setHorizontalTextPosition(SwingConstants.CENTER);
MenuButton.setFont(new Font("TimesRoman", Font.PLAIN, 20));
MenuButton.setBounds(width/6*5,height/3*2,width/6,height/3);
MenuButton.setIcon(new ImageIcon(i1));
MenuButton.setForeground(Color.white);
MenuButton.addActionListener(e -> {
});
add(MenuButton);
add(InventButton);
add(PartyButton);
revalidate();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bg,0,0,width,height, null);
g.dispose();
}
}
我已经基本上问了同样的问题,并且被告知我的背景是在我的JButtons上绘画的原因是因为我从未调用过super.paintComponent(g),但是我已经学会了。除了现在我已经设法破坏了我的新代码以及我的旧代码,这些代码在短时间内有效。我删除g.dispose()后,我的代码似乎正常工作; 有人知道按钮为什么看起来不合适?
答案 0 :(得分:3)
你说:
我删除g.dispose();
后,我的代码似乎正常工作
然后删除它。
您永远不应该永远处理JVM提供给您的Graphics对象。您应该做的第一件事是从g.dispose()
方法中调出paintComponent(...)
。如果您复制Graphics对象并使用副本进行绘制,或者使用从BufferedImage获取的Graphics对象进行绘制,那么是,将它们丢弃以节省资源,但是如果丢弃JVM的Graphics对象,则可能会导致绘制问题当JVM尝试继续使用该Graphics对象绘制其他组件时流。