2013-10-20 43 views
0

问题: Main.repaint()不适用于我。 repaint()不会在Main中调用我的paint方法。我已经尝试在重绘之前调用验证,但没有成功。主要涂料完全初始或当调整大小,但是当我在我的代码中调用repaint()时,什么都没有发生。JApplet repaint()不起作用

这里是程序的外观如何,到目前为止link

所以我试着去创造一个选择屏幕在Java游戏。我的游戏是一个JApplet。我具有这样的结构,如下所示:

  1. 我的延伸JApplet的并含有 LevelScreen类的一个对象

    LevelScreen具有主调用paint方法主要类。

我试图避免使用Swing,因为布局管理器给我设计带来麻烦。所以我试图制造出更简单,更符合我需要的结构。

paint()方法在Main.java

public class Main extends JApplet { 

    public static final int WIDTH = 700, HEIGHT = 500; 
    private static Main instance; 

    private LevelScreen levelScreen = new LevelScreen(); 
    private View view = View.LEVELSCREEN; 

    public static Main getInstance() { 
     if (instance == null) 
      instance = new Main(); 
     return instance; 
    } 

    @Override 
    public void init() { 
     setSize(WIDTH, HEIGHT); 
     addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 
       Point p = e.getPoint(); 
       if (view == View.LEVELSCREEN) { 
        levelScreen.mouseMoved(p); 
       } 
      } 
     }); 
    } 

    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     if (view == View.LEVELSCREEN) 
      levelScreen.paint(g2); 
    } 

    public enum View { 
     GAME, LEVELSCREEN; 
    } 
} 

在我的按钮的代码,我尝试重绘主要是因为我想打一个淡出动画当鼠标离开按钮。我的问题是,我不能调用漆(图形克),主要与重绘()

在这里,我呼吁重绘():

public void mouseExited() { 
     //start new thread to make fade out animation when mouse leave 
     mouseOver = false; 
     TimerTask task = new TimerTask() { 

      @Override 
      public void run() { 
       while (!mouseOver && opacity > 0.6) { 
        opacity -= 0.02; 
        //set level to 999 so i can see if the game repaints() 
        level = 999; 
        Main.getInstance().repaint(); //this doesnt work!! 
        try { 
         Thread.sleep(20); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }; 
     new Thread(task).start(); 
} 

回答

1

这是您实现Singleton设计方式有问题模式。你这样做的方式不适用于小程序,小程序容器为你创建实例。你可以通过改变getInstance如下修正:

public Main getInstance() { 
    return instance; 
} 

这行添加到init方法:

instance = this; 

顺便说一句,你不应该在一个Swing组件覆盖paint,其中JApplet是。您应该改写paintComponent,并拨打super.paintComponent(g)作为第一行。这应该解决这个问题。

+0

工作完美!我误解了JApplet是如何由浏览器创建的,而不是程序。 – Bjorn

1
Main.getInstance().repaint(); //this doesnt work!! 

我并不感到惊讶。您不是创建JApplet实例的人,浏览器是。

当调用此...

public static Main getInstance() { 
    if (instance == null) 
     instance = new Main(); 
    return instance; 
} 

您实际上是创建小应用程序,这不是一个是在屏幕上,所以当你打电话repaint,秋千去的第二个实例,“没有意义,你甚至不能显示“,并且什么都不做。

如果没有更多的代码背景信息,您甚至可能不需要getInstance,而是使用Main.this来代替当前实例。

你也应该考虑看看Performing Custom Painting

JAppelt这样的顶级容器不是双缓冲的,它需要更多的工作来直接绘制它们。相反,将您的应用程序移至基于JPanel之类的东西,并改写它的paintComponent方法。

绘画也是一个复杂的多层方案。您必须致电super.paintXxx以保护涂料链并防止出现任何可能的问题。

+0

我之所以使用JApplet而不是JFrame是因为我想让我的游戏在某个时候在浏览器中运行。编译器说Main.this在范围内不可访问。 我发现了一个临时的脏解决方案,它只是在一定的时间间隔内进行主重绘() – Bjorn