2013-07-10 6 views
0

Прошедшая неделя поиска не принесла никакой рабочей помощи, пытаясь понять, как это сделать. Когда пользователь нажимает на обратное пространство, он сохраняет игру. Я установил, что он показывает маленькую коробку наверху, в которой говорится «Сохранение ..», и я хочу, чтобы он оставался там около 2 секунд. Я могу получить его, чтобы показать, пока кнопка нажата с этим кодом:Используйте таймер при нажатии клавиши

if (key.save) { 
    font = new Font(null, 0, 16); 
    g.setFont(font); 
    g.setColor(Color.DARK_GRAY); 
    g.fillRect(getWidth()/2 - 40, -1, 80, 35); 
    g.setColor(Color.BLACK); 
    g.drawRect(getWidth()/2 - 40, -1, 80, 35); 
    g.setColor(Color.white); 
    g.drawString("Saving..", getWidth()/2 - 30, 22); 
} 

Но этот код не будет работать, он даже не будет отображаться в поле вверху:

if (key.save) { 
    ActionListener action = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Font font = new Font(null, 0, 16); 
      g.setFont(font); 
      g.setColor(Color.DARK_GRAY); 
      g.fillRect(getWidth()/2 - 40, -1, 80, 35); 
      g.setColor(Color.BLACK); 
      g.drawRect(getWidth()/2 - 40, -1, 80, 35); 
      g.setColor(Color.white); 
      g.drawString("Saving..", getWidth()/2 - 30, 22); 
     } 
    }; 

    timer = new Timer(0, action); 
    timer.start(); 
} 
+3

Картина должна выполняться в централизованном месте. Это означает, что каждый раз, когда экран обновляется, он перестраивается для представления текущего состояния пользовательского интерфейса, это будет включать в себя сообщения. Таким образом, вы можете использовать другой таймер для изменения состояния пользовательского интерфейса и удалить сообщение при следующем перекраске экрана. I * HOPE * вы используете двойную буферизацию, а не 'getGraphics' ... – MadProgrammer

+0

Да, я дважды буферизуюсь. Я действительно не понимаю, как «использовать другой таймер для изменения состояния пользовательского интерфейса и удалить сообщение при следующем перекраске экрана». – Shzylo

+0

Объект Graphics, g, не должен быть полем класса, и вы используете его как таковое, так как ваш код испорчен. Прошли ли вы через обучающие программы Swing Graphics, так как они вам очень помогут. «Изменив состояние пользовательского интерфейса», он означает, что вы измените поля класса, вызовите 'repaint()' и используйте метод paintComponent (...) ', чтобы изменить отображаемую графику. –

ответ

0

Написанный в псевдо-код можно построить решение с использованием нескольких частей:

  • Ввести поле saveMessageIsVisible, который установлен в false
  • Ins язь ключ обработки метода
    • клона состояние игры
    • начать новую тему и сохранить состояние
    • в конце этой нити, установите saveMessageIsVisible к истинному (и, возможно, выполнить экран ТЕРЯЕТСЯ)
    • также начать таймер с продолжительностью 2 секунды, после которого вы снова установите поле на значение false.
  • Внутри рутинной проверки цвета для поля и нарисуйте поле сохранения.
0

для выполнения задачи в течение определенного периода времени, вы можете сделать следующее:

ExecutorService service = Executors.newSingleThreadExecutor(); 
try { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
     // task 
     } 
    }; 

    Future<?> f = service.submit(r); 

    f.get(2, TimeUnit.MINUTES);  // attempt the task for two minutes 
} catch (Exception e) { 
    //Handele Exception 
} finally { 
    service.shutdown(); 
} 
2

enter image description here

Это пример базовой концепции с использованием списка визуализируемых артефактов которые могут обновляться с течением времени.

Основная идея заключается в том, что существует центральная петля краски, которая отвечает за обновление текущего состояния пользовательского интерфейса на основе того, что вы хотите визуализировать. Это означает, что любые изменения в пользовательском интерфейсе должны проходить через этот центральный цикл.

В этом примере используется только Swing, но концепция должна быть легко переведена.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class QuickPaint01 { 

    public static void main(String[] args) { 
     new QuickPaint01(); 
    } 

    public QuickPaint01() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel implements Environment { 

     private List<Drawable> drawables; 

     public TestPane() { 
      drawables = new ArrayList<>(25); 
      Timer update = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Drawable[] draws = drawables.toArray(new Drawable[drawables.size()]); 
        for (Drawable drawable : draws) { 
         if (drawable instanceof Moveable) { 
          ((Moveable)drawable).update(TestPane.this); 
         } 
        } 
        repaint(); 
       } 
      }); 
      update.setCoalesce(true); 
      update.setRepeats(true); 
      update.start(); 
      drawables.add(new Ball()); 
     } 

     @Override 
     public void add(Drawable drawable) { 
      drawables.add(drawable); 
     } 

     @Override 
     public void remove(Drawable drawable) { 
      drawables.remove(drawable); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (Drawable drawable : drawables) { 
       drawable.draw(this, g2d); 
      } 
      g2d.dispose(); 
     } 
    } 

    public interface Environment { 

     public Dimension getSize(); 
     public void add(Drawable drawable); 
     public void remove(Drawable drawable); 

    } 

    public interface Drawable { 

     public void draw(Environment env, Graphics2D g); 

    } 

    public interface Moveable extends Drawable { 

     public void update(Environment env); 

    } 

    public class Ball implements Moveable { 

     private int radius = 20; 

     private int x = 0; 
     private int y = 0; 

     private int xDelta = 4; 

     private Shape shape; 

     public Ball() { 
      shape = new Ellipse2D.Float(0, 0, radius, radius); 
     } 

     @Override 
     public void update(Environment env) { 
      x += xDelta; 
      if (x + radius > env.getSize().width) { 

       x = env.getSize().width - radius; 
       xDelta *= -1; 

       env.add(new Message(env, "<< Bounce", 1)); 

      } else if (x < 0) { 

       x = 0; 
       xDelta *= -1; 

       env.add(new Message(env, "Bounce >> ", 1)); 

      } 
      y = (env.getSize().height - radius)/2; 
     } 

     @Override 
     public void draw(Environment env, Graphics2D g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.translate(x, y); 
      g2d.setColor(Color.BLUE); 
      g2d.fill(shape); 
      g2d.dispose(); 
     } 

    } 

    public class Message implements Drawable { 

     private Environment environment; 
     private String message; 
     private int delay; 

     public Message(Environment environment, String message, int delay) { 
      this.environment = environment; 
      this.message = message; 
      this.delay = delay; 

      Timer timer = new Timer(delay * 1000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Message.this.environment.remove(Message.this); 
       } 
      }); 
      timer.start(); 
     } 

     @Override 
     public void draw(Environment env, Graphics2D g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      FontMetrics fm = g2d.getFontMetrics(); 
      g2d.drawString(message, env.getSize().width - fm.stringWidth(message), 0 + fm.getAscent()); 
      g2d.dispose(); 
     } 

    } 

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