2014-10-02 2 views
1

Я занимаюсь разработкой java-апплетов после учебника, найденного здесь: Я использую это как основу для расширения своего собственного приложения. Но вот проблема.Изображения не рисованы/показаны с использованием paintComponent()

Я хочу добавить JButtons в апплет для определенных функций (запуск, параметры и т. Д.). Но я обнаружил, что они мерцают, когда я нависаю над ними и полностью скрываюсь, если не тронут. Я читал, что он должен делать с двойной буферизации, и что я должен использовать paintComponent вместо краски, например

public void paintComponents(Graphics g) { 
    super.paintComponents(g); 
} 

Это решает JButtons от мерцающих, но тогда методы g.drawimage обанкротились, или я ничего не понимаю полностью, поскольку изображения, которые я пытаюсь нарисовать, не отображаются. Я не знаю, скрыты они или не могут быть загружены или что. Если бы кто-то мог указать на правильное направление, это было бы здорово.

public class StartingClass extends Applet implements Runnable, KeyListener, ActionListener { 

    private PlayerChar playerChar; 
    private Image image, currentSprite, character, characterDown, characterJumped, background; 
    private Graphics second; 
    private URL base; 
    private static Background bg1, bg2; 
    private JButton start, options; 
    private boolean running = false; 
    private int score; 

    @Override 
    public void init() { 

     setSize(800, 480); 
     setFocusable(true); 
     addKeyListener(this); 
     Frame frame = (Frame) this.getParent().getParent(); 
     frame.setTitle("GraviOn-Alpha"); 
     try { 
      base = getDocumentBase(); 

     } 
     catch (Exception e) { 
      // TODO: handle exception 
     } 

     // Image Setups 
     character = getImage(base, "data/character.png"); 
     characterDown = getImage(base, "data/down.png"); 
     characterJumped = getImage(base, "data/jumped.png"); 
     currentSprite = character; 
     background = getImage(base, "data/background.png"); 

     score = 0; 
    } 

    @Override 
    public void start() { 

     bg1 = new Background(0, 0); 
     bg2 = new Background(2160, 0); 
     playerChar = new PlayerChar(); 

     JPanel myPanel = new JPanel(); 
     start = new JButton("Start"); 
     start.addActionListener(this); 
     options = new JButton("Change Colour"); 
     options.addActionListener(this); 
     myPanel.add(start); 
     myPanel.add(options); 
     myPanel.setBackground(Color.BLACK); 
     myPanel.setPreferredSize(new Dimension(100, 75)); 
     this.add(myPanel); 

     Thread thread = new Thread(this); 
     thread.start(); 

    } 

    @Override 
    public void stop() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void run() { 
     while (true) { 
      if (running == true) { 
       playerChar.moveRight(); 
       score += 3; 
       start.setVisible(false); 
       options.setVisible(false); 
      } 
      else { 

      } 
      playerChar.update(); 
      if (playerChar.isJumped()) { 
       currentSprite = characterJumped; 
      } 
      else if (playerChar.isJumped() == false && playerChar.isDucked() == false) { 
       currentSprite = character; 
      } 

      bg1.update(); 
      bg2.update(); 
      repaint(); 

      try { 
       Thread.sleep(17); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void update(Graphics g) { 
     if (image == null) { 
      image = createImage(this.getWidth(), this.getHeight()); 
      second = image.getGraphics(); 
     } 

     second.setColor(getBackground()); 
     second.fillRect(0, 0, getWidth(), getHeight()); 
     second.setColor(getForeground()); 
     paint(second); 

     g.drawImage(image, 0, 0, this); 

    } 

    @Override 
    public void paintComponents(Graphics g) { 
     super.paintComponents(g); 
     g.drawImage(background, bg1.getBgX(), bg1.getBgY(), this); 
     g.drawImage(background, bg2.getBgX(), bg2.getBgY(), this); 
     g.drawImage(currentSprite, playerChar.getCenterX() - 61, playerChar.getCenterY() - 63, this); 
     g.drawString("Score: " + score, 50, 50); 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     switch (e.getKeyCode()) { 
      case KeyEvent.VK_UP: 
       System.out.println("Move up"); 
       break; 

      case KeyEvent.VK_DOWN: 
       currentSprite = characterDown; 
       if (playerChar.isJumped() == false) { 
        playerChar.setDucked(true); 
        playerChar.setSpeedX(0); 
       } 
       break; 

      case KeyEvent.VK_LEFT: 
       // playerChar.moveLeft(); 
       playerChar.setMovingLeft(true); 
       break; 

      case KeyEvent.VK_RIGHT: 
       // playerChar.moveRight(); 
       playerChar.setMovingRight(true); 
       break; 

      case KeyEvent.VK_SPACE: 
       playerChar.jump(); 
       break; 

     } 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     switch (e.getKeyCode()) { 
      case KeyEvent.VK_UP: 
       System.out.println("Stop moving up"); 
       break; 

      case KeyEvent.VK_DOWN: 
       currentSprite = character; 
       playerChar.setDucked(false); 
       break; 

      case KeyEvent.VK_LEFT: 
       playerChar.stopLeft(); 
       break; 

      case KeyEvent.VK_RIGHT: 
       playerChar.stopRight(); 
       break; 

      case KeyEvent.VK_SPACE: 
       break; 

     } 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    public static Background getBg1() { 
     return bg1; 
    } 

    public static Background getBg2() { 
     return bg2; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("Start")) { 
      running = true; 

     } 
     if (e.getActionCommand().equals("Change Colour") && character == getImage(base, "data/character.png")) { 

      character = getImage(base, "data/character2.png"); 
     } 
     else if (e.getActionCommand().equals("Change Colour") && character == getImage(base, "data/character2.png")) { 

      character = getImage(base, "data/character.png"); 
     } 
     repaint(); 
    } 
} 

Это попытка использования метода paintComponents. Я был бы очень признателен за помощь.

EDIT: Я изменил использование Japplet и использовал paintComponent в Jpanel, чтобы нарисовать все, и он работал нормально, все на основе JApplet - super.paint(); causes flicker.

+1

'общественный недействительный paintComponents (График г) {super.paintComponents (г);' 'должен быть общественной недействительной краска (график г) {super.paint (г);'. Другие вопросы: 1) Зачем использовать AWT? См. [Этот ответ] (http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) по многим причинам, чтобы отказаться от использования AWT с использованием компонентов в пользу Swing. 2) Зачем писать апплет? Если это связано с тем, что учитель указал на это, обратитесь к [Почему учителя CS должны ** останавливаться ** преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-учебно-ява-апплеты /). –

+0

@AndrewThompson Tha kyou для ответа, я изменил его на paint() из paintComponents(), но теперь я вернулся к квадрату, изображения рисуются, но jbuttons не отображаются, если я не навис над ними, и они мерцают один раз Я делаю. –

ответ

1

Я изменил использование Japplet и использовал paintComponent в Jpanel, чтобы нарисовать все, и он работал нормально.

JPanel myPanel = new JPanel(){ 

     @Override  
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(background, bg1.getBgX(), bg1.getBgY(), this); 
      g.drawImage(background, bg2.getBgX(), bg2.getBgY(), this); 
      g.drawImage(currentSprite, playerChar.getCenterX() - 61, playerChar.getCenterY() - 63, this); 
      g.drawString("Score: " + score, 50, 50); 


    } 
Смежные вопросы