关于java图形重绘的问题(画五子棋)

时间:2023-02-02 07:47:39
程序如下:


     package chengxu;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.io.PrintStream;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.*;
import java.io.*;
import java.net.*;

public class shi extends Frame
{
// Frame f=new Frame("TestMenuBar");
Image oimg=null;
Graphics og=null;
MenuBar menubar=new MenuBar(); //创建菜单条对象
Menu fileM=new Menu("游戏"); //创建各菜单
Menu editM=new Menu("视图"); //创建各菜单
Menu toolsM=new Menu("网络对弈"); //创建各菜单
Menu helpM=new Menu("帮助"); //创建各菜单

MenuItem fileMI1=new MenuItem("New"); //创建各菜单项
MenuItem fileMI2=new MenuItem("Open"); //创建各菜单项
MenuItem fileMI3=new MenuItem("Save"); //创建各菜单项
CheckboxMenuItem fileMI5=new CheckboxMenuItem("Quit",true);
 //创建各菜单项
 
     Menu filePrint = new Menu("print");//创建子菜单
     MenuItem printM1 = new MenuItem("preview");
     MenuItem printM2 = new MenuItem("setting");
     
shi()
{
FlowLayout fl=new FlowLayout();
setLayout(fl);
menubar.add(fileM); //将菜单加入菜单条
menubar.add(editM); 
menubar.add(toolsM); 
menubar.add(helpM); 

fileM.add(fileMI1); //将菜单项加入file菜单中
fileM.add(fileMI2); 
fileM.add(fileMI3);

filePrint.add(printM1);//将菜单项加入print菜单中
filePrint.add(printM2);
fileM.add(filePrint);
 //将print菜单作为一个菜单项加入file菜单中

fileM.addSeparator(); //将一条分割线加入菜单中
fileM.add(fileMI5); //将菜单项加入菜单中
setMenuBar(menubar); //把整个菜单系统显示在窗口中
setBounds(0,0,630,630);
setVisible(true);
Dimension d=getSize();
oimg=createImage(d.width,d.height);
og=oimg.getGraphics();
            
addWindowListener(new WindowAdapter() 
                 {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
      });
 Graphics g = getGraphics();
     for(int j=0;j<15;j++)                     //画出棋盘
      for(int i=0;i<15;i++)
          {
        int x = 30*i+90;
        int y = 30*j+90;         
            g.setColor(Color.red);
            g.drawRect(x,y,30,30);
            og.setColor(Color.red);
            og.drawRect(x,y,30,30);
          }
      addMouseListener(new MouseAdapter()               //鼠标点击事件
          {
                int xx;
           int x;
           int y;
           public void mousePressed(MouseEvent e)           
             {
              if(e.getX()<555&&e.getX()>75&&e.getY()<555&&e.getY()>75)  
           { 
           x=((e.getX()-15)/30+1)*30;       //计算坐标
           y=((e.getY()-15)/30+1)*30;
           Graphics g = getGraphics();
          
      g.setColor(Color.red);
     g.fillOval(x-8,y-8,16,16);          //画出棋子
                            }
    
             }
           });
        } 
    public void paint(Graphics g)              //重绘图象
{
if(oimg !=null)
getGraphics().drawImage(oimg,0,0,this);
}  
public static void main(String[] args)
{
new shi();
    }   
}

图形无法重绘   
每次图形最小化 就只见棋盘不见旗子   
可能是无法重绘  望解答!!!

5 个解决方案

#1


会不会和画得先后次序有关.

#2


要重载一下最小化,恢复函数,将重画功能加入进去.

#3


你的public void paint(Graphics g)  方法里只画了getGraphics().drawImage(oimg,0,0,this);----棋盘.
所以,你只看到棋盘,不能看到棋子.

#4


定义一个数组(或容器),记录每个棋子的颜色与x,y坐标,paint事件里对之进行循环,用fillOval重画每一个棋子

#5


wangaiguo(英雄爱过美人关) 
说的是正确的,你应该将画棋盘和棋子的动作都写在paint函数里,如果发生落子等变化,调用repaint函数就可以了

#1


会不会和画得先后次序有关.

#2


要重载一下最小化,恢复函数,将重画功能加入进去.

#3


你的public void paint(Graphics g)  方法里只画了getGraphics().drawImage(oimg,0,0,this);----棋盘.
所以,你只看到棋盘,不能看到棋子.

#4


定义一个数组(或容器),记录每个棋子的颜色与x,y坐标,paint事件里对之进行循环,用fillOval重画每一个棋子

#5


wangaiguo(英雄爱过美人关) 
说的是正确的,你应该将画棋盘和棋子的动作都写在paint函数里,如果发生落子等变化,调用repaint函数就可以了