请问有人知道么。。我觉得应该是paintComponent方法里有问题。。但不知道具体是什么出了问题??

解决方案 »

  1.   

    Cell类:public class Cell extends JPanel{
    //该位置存储的数
    private int number;
    //该位置能否被修改
    private boolean changeable;
    //判断该位置是否属于答案区
    private boolean belongsToAnswersPart;
    //判断该位置是否属于出题区(用户自定义题目时使用)
    private boolean belongsToQuestionsPart;
    //该位置的坐标
    private int x, y;
    //判断鼠标是否已进入该位置
    private boolean enter;
    //判断该位置是否已被选中
    private boolean chosen;
    //判断该位置是否属于自定义时的地图
    private boolean belongsToCustom;


    public Cell(){
    this.setOpaque(false);
    this.setPreferredSize(new Dimension(40, 40));
    this.addMouseListener(new MouseListener());



    }

    public int getNumber(){
    return this.number;
    }

    public void setNumber(int num){
    this.number = num;
    repaint();
    }

    public boolean getChangeable(){
    return this.changeable;
    }

    public void setChangeable(boolean changeable){
    this.changeable = changeable;
    }

    public boolean getBelongsToAnswersPart(){
    return this.belongsToAnswersPart;
    }

    public void setBelongsToAnswersPart(boolean isAnswersPart){
    this.belongsToAnswersPart = isAnswersPart;
    }

    public boolean getBelongsToQuestionsPart(){
    return this.belongsToQuestionsPart;
    }

    public void setBelongsToQuestionsPart(boolean isQuestionsPart){
    this.belongsToAnswersPart = isQuestionsPart;
    }


    public int getX(){
    return this.x;
    }

    public void setX(int x){
    this.x = x;
    }

    public int getY(){
    return this.y;
    }

    public void setY(int y){
    this.y = y;
    }

    public boolean getEnter(){
    return this.enter;
    }

    public void setEnter(boolean enter){
    this.enter = enter;
    repaint();
    }

    public boolean getChosen(){
    return this.chosen;
    }

    public void setChosen(){
    this.chosen = !this.chosen;
    repaint();
    }

    public void setChosen(boolean choose){
    this.chosen = choose;
    repaint();
    }

    public boolean getBelongsToCustom(){
    return this.belongsToCustom;
    }

    public void setBelongsToCustom(boolean belongsToCustom){
    this.belongsToCustom = belongsToCustom;
    }

    protected void paintComponent(Graphics g){
    super.paintComponent(g);

    if (this.getChosen()){
    Graphics2D g2d=(Graphics2D)g;
    Stroke stroke=new BasicStroke(5.0f);
    g2d.setStroke(stroke);
    g2d.setColor(Color.RED);
    g2d.drawRoundRect(0, 0, 40, 40, 10, 10);
    }

    if (this.getEnter()){
    Graphics2D g2d=(Graphics2D)g;
    Stroke stroke=new BasicStroke(4.0f);
    g2d.setStroke(stroke);
    g2d.setColor(Color.PINK);
    g2d.drawRoundRect(0, 0, 40, 40, 10, 10);
    }

    for(int i = 1; i < 10; i++){
    if(this.number == i){
    if((this.getChangeable() == false && this.getBelongsToAnswersPart() == false ) || this.getBelongsToCustom()){
    try {
    Image img = ImageIO.read(new File("image/number/已知" + i + ".png"));
    g.drawImage(img,0, 0, 40, 40, this);
    } catch (IOException e) {
    e.printStackTrace();
    JOptionPane.showMessageDialog(null, "找不到图片!");
    }
    }
    else {
    try {
    Image img = ImageIO.read(new File("image/number/输入" + i + ".png"));
    g.drawImage(img, 0, 0, 40, 40, this);
    } catch (IOException e) {
    e.printStackTrace();
    JOptionPane.showMessageDialog(null, "找不到图片!");
    }
    }
    }
    }




    if (!(this.getBelongsToAnswersPart() || this.getBelongsToQuestionsPart())){
    if (this.isRepeated(Cell.this.getNumber())){
    try {
    Image img = ImageIO.read(new File("image/number/重复.png"));
    g.drawImage(img, 0, 0, 40, 40, this);
    } catch (IOException e) {
    e.printStackTrace();
    JOptionPane.showMessageDialog(null, "找不到图片!");
    }
    }
    }

    }
    private class MouseListener extends MouseAdapter {
    public void mouseClicked(MouseEvent e){
    if(Cell.this.getChangeable()){
    Cell.this.setChosen();
    if(Cell.this.getBelongsToCustom()){
    CustomizedSudoku.setSiteSelected();
    }else {
    Sudoku.setSiteSelected();
    }


    if(!(Cell.this.getBelongsToAnswersPart() || Cell.this.getBelongsToQuestionsPart())){
    if (Cell.this.getChosen()){
    for(int i = 0; i < 9; i++){
    for(int j = 0; j < 9; j++){
    if (i != Cell.this.getX() && j != Cell.this.getY()){
    if (Cell.this.getBelongsToCustom()){
    CustomizedSudoku.sudoku[i / 3][j / 3].grid[i  % 3][j % 3].setChosen(false);
    }else {
    Sudoku.sudoku[i / 3][j / 3].grid[i  % 3][j % 3].setChosen(false);
    }
    }
    }
    }
    }
    }

    //该位置被选中
    if(Cell.this.getBelongsToCustom()){
    CustomizedSudoku.setLastX(Cell.this.getX());
    CustomizedSudoku.setLastY(Cell.this.getY());
    }else{
    Sudoku.setLastX(Cell.this.getX());
    Sudoku.setLastY(Cell.this.getY());
    }
    }
    else if(Cell.this.getBelongsToAnswersPart()){
    //已经有位置被选中了
    if(Sudoku.getSiteSelected()){
    //重复与否判断
    if (!Cell.this.isRepeated(Cell.this.getNumber())){
    Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX()  % 3][Sudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
    Sudoku.displayArray[Sudoku.getLastX()][Sudoku.getLastY()] = Cell.this.getNumber();
    }else {
    Sudoku.sudoku[Sudoku.getLastX()  / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX()  % 3][Sudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
    Timer timer = new Timer(2000, new ActionListener(){
    public void actionPerformed(ActionEvent e){
    Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX() % 3][Sudoku.getLastY() % 3].setNumber(0);
    Sudoku.displayArray[Sudoku.getLastX()][Sudoku.getLastY()] = 0;
    }
    });
    timer.start();
    if (Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX() % 3][Sudoku.getLastY() % 3].getNumber() == 0){
    timer.stop();
    }
    }

    }
    }
    else if(Cell.this.getBelongsToQuestionsPart()){
    if(CustomizedSudoku.getSiteSelected()){
    //重复与否判断
    if (!Cell.this.isRepeated(Cell.this.getNumber())){
    CustomizedSudoku.custom[CustomizedSudoku.getLastX()][CustomizedSudoku.getLastY()] = Cell.this.getNumber();
    CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
    }else {
    CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
    Timer timer = new Timer(2000, new ActionListener(){
    public void actionPerformed(ActionEvent e){
    CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].setNumber(0);
    }
    });
    timer.start();
    if (CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].getNumber() == 0){
    timer.stop();
    }
    }

    }
    }
    //**********尚未:如果点了提示,则在小面板中标出可行的数字
    }

    public void mouseEntered(MouseEvent e){
    Cell.this.setEnter(true);
    }
    public void mouseExited(MouseEvent e){
    Cell.this.setEnter(false);
    repaint();
    }
    } protected boolean isRepeated(int number){
    int x = 0, y = 0;

    if(this.getBelongsToAnswersPart()){
    x = Sudoku.getLastX() / 3;
    y = Sudoku.getLastY() / 3;

    for (int i = 0; i < 3; i++){
    for (int j = 0; j < 3; j++){
    //检查同格
    if (Sudoku.sudoku[x][y].grid[i][j].getNumber() == number){
    return true;
    }
    //检查同列
    if (Sudoku.sudoku[x+i][y].grid[Sudoku.getLastX() % 3][j].getNumber() == number){
         return true;
         }
    //检查同行
    if (Sudoku.sudoku[x][y+i].grid[j][Sudoku.getLastY() % 3].getNumber() == number){
         return true;
         }
    }
    }
    }

    if(this.getBelongsToQuestionsPart()){
    x = CustomizedSudoku.getLastX() / 3;
    y = CustomizedSudoku.getLastY() / 3;

    for (int i = 0; i < 3; i++){
    for (int j = 0; j < 3; j++){
    //检查同格
    if (CustomizedSudoku.sudoku[x][y].grid[i][j].getNumber() == number){
    return true;
    }
    //检查同列
    if (CustomizedSudoku.sudoku[x+i][y].grid[CustomizedSudoku.getLastX() % 3][j].getNumber() == number){
         return true;
         }
    //检查同行
    if (CustomizedSudoku.sudoku[x][y+i].grid[j][CustomizedSudoku.getLastY() % 3].getNumber() == number){
         return true;
         }
    }
    }
    }

    if(number == 0){
    return false;
    }
    return false;
    }
    }
    Grid类:
    public class Grid extends JPanel{
    Cell[][] grid = new Cell[3][3];

    public Grid() {
    this.setOpaque(false);
    this.setPreferredSize(new Dimension(122, 122));
    this.setLayout(new GridLayout(3, 3, 1, 1));
    for (int i = 0; i < 3; i++){
    for (int j = 0; j < 3; j++){
    grid[i][j] = new Cell();
    this.add(grid[i][j]);
    }
    }
    }
    }应该是这两个里面哪个地方出问题了。。
      

  2.   

    我洗澡完上来仔细看了再回复,swing比较精通,乐于解决问题:)
      

  3.   


    谢谢!!
    另外Cell类某些地方我小改了些内容。。不过还是显示重叠的- -
      

  4.   

    代码编译不过,看得累死了,给你一段我写的代码,看看是否对你有用。public class HomePageModulePanel extends JPanel
    {
    private ImageIcon wallpaper;
    public HomePageModulePanel(String title)
    {
    if (title.equals("mokuai1"))
    {
    wallpaper = ImageIconUtil.getImageIcon("01.PNG");
    }
    else if(title.equals("mokuai2"))
    {
    wallpaper = ImageIconUtil.getImageIcon("02.PNG");
    }
    ......
    }
    protected void paintComponent(Graphics g)
    {
    // Image image = wallpaper.getImage();
    int cw = getWidth();
    int ch = getHeight(); ImageIcon scaledSymbol = new ImageIcon(wallpaper.getImage()
    .getScaledInstance(cw, ch, Image.SCALE_SMOOTH));
    g.drawImage(scaledSymbol.getImage(), 0, 0, this);
    }
    }
    }
    public class HomePagePanel extends JPanel
    {
    public HomePagePanel()
    {
    super();
    setBorder(new EmptyBorder(8, 8, 8, 8));
    setLayout(new GridLayout(3, 2, 8, 8));
    initView();
    } public void initView()
    {
    add(new HomePageModulePanel("mokuai1"));
    add(new HomePageModulePanel("mokuai2"));
    ......
    }}