更多paintComponent问题,背景仍然在JPanel组件上绘制

时间:2014-06-02 23:14:37

标签: java swing jpanel jbutton paintcomponent

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()后,我的代码似乎正常工作; 有人知道按钮为什么看起来不合适?

1 个答案:

答案 0 :(得分:3)

你说:

  

我删除g.dispose();

后,我的代码似乎正常工作

然后删除它。

您永远不应该永远处理JVM提供给您的Graphics对象。您应该做的第一件事是从g.dispose()方法中调出paintComponent(...)。如果您复制Graphics对象并使用副本进行绘制,或者使用从BufferedImage获取的Graphics对象进行绘制,那么是,将它们丢弃以节省资源,但是如果丢弃JVM的Graphics对象,则可能会导致绘制问题当JVM尝试继续使用该Graphics对象绘制其他组件时流。