Java 自定义重绘根本不起作用

Java 自定义重绘根本不起作用,java,swing,Java,Swing,我正在尝试创建一个X/O游戏,当用户单击所需位置时,我无法调用drawString()。 我能够显示网格,并在用户单击的位置协调鼠标,但我无法在网格上重新绘制“X”和“O”。 请帮忙,谢谢 下面是代码片段: public class Tic_Tac_Toe extends JPanel { int xpos,ypos; ArrayList xlist = new ArrayList(); ArrayList ylist = new ArrayList();

我正在尝试创建一个X/O游戏,当用户单击所需位置时,我无法调用drawString()。 我能够显示网格,并在用户单击的位置协调鼠标,但我无法在网格上重新绘制“X”和“O”。 请帮忙,谢谢

下面是代码片段:

    public class Tic_Tac_Toe extends JPanel
{
    int xpos,ypos;
    ArrayList xlist = new ArrayList();
    ArrayList ylist = new ArrayList();
    Point cursorPosition;
    public static void main(String[] args)
    {
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);

        int x=0,y=0;
        boolean win,mark;
        Board b=new Board();

        Tic_Tac_Toe t=new Tic_Tac_Toe();
        t.dispFrame();

        while(!b.isGridFull())
        {
            b.printboard();

            System.out.println("Enter the desired character position:");
            try
            {
                x=Integer.parseInt(br.readLine());
                y=Integer.parseInt(br.readLine());
            }
            catch(Exception e)
            {
                System.out.println("Exception is:");
            }

            mark=b.placeMark(x,y);

            win=b.checkforwin();
            if(b.flag==true)
            {
                System.out.println("Congratulations player with character "+b.CurrentPlayerMark+" has won");
                break;
            }
            b.changePlayer();
        }
        if(b.flag==false)
            System.out.println("The game has been drawn!!!");
     }

     public void dispFrame()
     {
        JFrame frame = new JFrame("My New Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(300, 300));
        frame.setResizable(false);

        JPanel panel=new JPanel()
        {
            @Override
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.drawLine(30,100,270,100);
                g.drawLine(30,200,270,200);
                g.drawLine(100,35,100,250);
                g.drawLine(200,35,200,250);   

                for(int i = 0; i < xlist.size(); i ++)
                   {
                       Object a1=xlist.get(i);
                       Object b1=ylist.get(i);
                       int k=(Integer)a1;
                       int j=(Integer)b1;
                       g.drawString("X",k,j);
                   }


            }
            @Override
            public void update(Graphics g)
            {
                paint(g);
                if(Board.CurrentPlayerMark=='x')
                    g.drawString("X",xpos,ypos);
                else if(Board.CurrentPlayerMark=='o')
                    g.drawString("O",xpos,ypos);
            }
        };

        panel.addMouseListener(new MouseListener()
        {
            public char c;
            @Override
            public void mouseClicked(MouseEvent e)
            {                
                c=Board.CurrentPlayerMark;
                System.out.println(":MOUSE_CLICK_EVENT:");
                cursorPosition = MouseInfo.getPointerInfo().getLocation();
                xpos=cursorPosition.x;
                ypos=cursorPosition.y;
                xlist.add(xpos);
                ylist.add(ypos);

                Graphics g = getGraphics();
                update(g);
                repaint();      //Want to repaint here after user clicks on desired position in X/O grid
                                //Does update method is useful to call or not???
                System.out.println("xlist: " + xlist +"ylist: " + ylist);                
                System.out.println("X: " + xpos + " Y: " + ypos);
                System.out.println("CurrentPlayerMark is:"+c); 
                Board.changePlayer();
            }

             @Override
             public void mousePressed(MouseEvent e) {
             }

             @Override
             public void mouseReleased(MouseEvent e) {
             }

             @Override
             public void mouseEntered(MouseEvent e) {
             }

             @Override
             public void mouseExited(MouseEvent e) {
             }                          
         });
         frame.add(panel);
         frame.pack();
         frame.setVisible(true);       
     }
}
公共类Tic_Tac_Toe扩展JPanel
{
int XPO,YPO;
ArrayList xlist=新的ArrayList();
ArrayList ylist=新的ArrayList();
点光标定位;
公共静态void main(字符串[]args)
{
InputStreamReader isr=新的InputStreamReader(System.in);
BufferedReader br=新的BufferedReader(isr);
int x=0,y=0;
布尔赢,马克;
板b=新板();
Tic_Tac_Toe t=新Tic_Tac_Toe();
t、 dispFrame();
而(!b.isGridFull())
{
b、 印制板();
System.out.println(“输入所需的字符位置:”);
尝试
{
x=Integer.parseInt(br.readLine());
y=Integer.parseInt(br.readLine());
}
捕获(例外e)
{
System.out.println(“异常为:”);
}
标记=b.位置标记(x,y);
win=b.checkforwin();
如果(b.flag==true)
{
System.out.println(“祝贺角色为“+b.CurrentPlayerMark+”的玩家获胜”);
打破
}
b、 changePlayer();
}
如果(b.flag==false)
System.out.println(“游戏已经画好了!!!”;
}
公共无效dispFrame()
{
JFrame frame=新JFrame(“我的新框架”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(新尺寸(300300));
frame.setresizeable(false);
JPanel面板=新的JPanel()
{
@凌驾
公共组件(图形g)
{
超级组件(g);
g、 抽绳(30100270100);
g、 抽绳(3020027200);
g、 抽绳(100,35100250);
g、 抽绳(200,35200250);
对于(int i=0;i
在代码中单击鼠标后,您将在何处重新绘制。而Board类中的内容编辑代码段后,Board类仅提供功能和基本X/O逻辑交叉发布:。