在Java中使用Graphics绘图

时间:2014-11-15 21:44:02

标签: java graphics

我有一个图形问题。我试图在一个框架中绘制图像,但我遇到了一些问题。我想知道成功做我想做的事情的最佳方法是什么。 我将展示我的3个班级。 Main类创建Menu。按下Matchmaking按钮后,它会创建Board对象并调用Main.draw来绘制它的所有组件(现在只有Board)。图片只出现在某个时间,所以它让我意识到我的代码可能没有正确的设置方式。致谢!!!

MAIN CLASS

                import java.awt.Graphics;
                public class Main 
            {
                public static Board theBoard;

                public static void main(String[] args) 
                {
                    new Menu("Main Menu").setVisible(true); 
                }

                public static void draw(Graphics painter)
                {
                    theBoard.draw(painter);
                }
            }

菜单类

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class Menu extends JFrame implements ActionListener
    {
        //Jpanel
        JPanel pnlButton = new JPanel();
        //Buttons
        JButton btnMatchmaking = new JButton("Matchmaking");
        JButton btnExit = new JButton("Exit");
        JButton btnProfile = new JButton("Profile");
        JButton btnOption = new JButton("Options");

        public Menu(String s) 
        {        
            super("Bu$ted: " + s);  
            btnExit.addActionListener(this);
            btnMatchmaking.addActionListener(this);
            //JPanel setting
            pnlButton.add(btnMatchmaking);
            pnlButton.add(btnProfile);
            pnlButton.add(btnOption);
            pnlButton.add(btnExit);
            pnlButton.setVisible(true);

            //The winddow options
            super.setLocation(0,0); //A remplacer par des dimension variables
            super.setSize(600, 500);    //A remplacer par des dimension variables
            super.setResizable(false);
            super.setVisible(true);
            super.add(pnlButton);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }

        //Handle action events.
        //@param evt
        @Override
        public void actionPerformed(ActionEvent evt) 
        { 
            if(evt.getSource() == btnMatchmaking)
            {
                super.remove(pnlButton);   
                Main.theBoard = new Board("TestBoard");
                super.add(Main.theBoard);
                super.setSize(Main.theBoard.boardSize);      
                Main.draw(super.getGraphics()); 


            }
            if(evt.getSource() == btnExit)
            {
                System.exit(0);
            }
        }
    }

BOARD CLASS

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class Board extends JPanel
{
    BufferedImage boardImage;
    int width;
    int height;
    Dimension boardSize;

    public Board (String boardName)
    {
        boardImage = loadBoard(boardName);
        width=boardImage.getWidth();
        height=boardImage.getHeight();
        boardSize = new Dimension(width,height);
        this.setVisible(true);
        System.out.println("The board is setup.");
    }

    private BufferedImage loadBoard (String boardName)
    {
        BufferedImage img = null;
        try 
        {
            img = ImageIO.read(new File("Components/"+boardName+".png"));
        } 
        catch (IOException e) 
        {
            System.out.println("The board image couldn't be loaded.");
        }
        return img;
    }

    public void draw(Graphics painter)
    {
        painter.drawImage(boardImage, 0, 0, null);
        System.out.println("The board image was painted.");
    }
}

1 个答案:

答案 0 :(得分:0)

推荐的方法是覆盖paintComponent类的Board并让绘画系统处理它......

有关详细信息,请参阅Painting in AWT and SwingPerfoming Custom Painting