powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
10 сообщений из 10, страница 1 из 1
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38404762
moskov199
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть состоит в следующем... Имеется два класса ClockApplet и Clock... В первом классе я запускаю поток, метод run которого находится во втором классе Clock. В методе run я выполняю метод paint который должен выводить число, которое при каждом вызове метода paint увеличивается на единицу. Сообственно вот код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
package clockapplet;

import java.applet.Applet;
import java.awt.Graphics;
import java.io.IOException;
import java.lang.Thread;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ClockApplet extends Applet  {
     int i = 0;
     Graphics g;
     
    
  public void paint(Graphics g) 
     {
      g.clearRect(0, 0, 640, 640);
      i++;
      String s = Integer.toString(i);   
      g.drawString(s, 50, 25);
      
      }
    

    @Override
    public void start() 
    
  {
     ClockApplet clockApplet = new ClockApplet(); 
     Clock clock = new Clock();
     clock.start();
 
  }    
    
    public void init()
    {
         
    }
 
   
} 





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
package clockapplet;

import java.awt.Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 111
 */
public class Clock extends Thread {
  ClockApplet clockApplet = new ClockApplet();
  
   public void run()
   {
       while (true)
       {
        clockApplet.paint(clockApplet.g);

       try {
           sleep(1000);
       } catch (InterruptedException ex) {
           Logger.getLogger(Clock.class.getName()).log(Level.SEVERE, null, ex);
       }
       }
   }

  
    
}



Вот нужно сделать так чтобы поток увеличивал число на единицу, у меня к сожалению не получается... Господа помогите, буду очень благодарен.
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38404779
moskov199
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
moskov199Суть состоит в следующем... Имеется два класса ClockApplet и Clock... В первом классе я запускаю поток, метод run которого находится во втором классе Clock. В методе run я выполняю метод paint который должен выводить число, которое при каждом вызове метода paint увеличивается на единицу. Сообственно вот код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
package clockapplet;

import java.applet.Applet;
import java.awt.Graphics;
import java.io.IOException;
import java.lang.Thread;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ClockApplet extends Applet  {
     int i = 0;
     Graphics g;
     
    
  public void paint(Graphics g) 
     {
      g.clearRect(0, 0, 640, 640);
      i++;
      String s = Integer.toString(i);   
      g.drawString(s, 50, 25);
      
      }
    

    @Override
    public void start() 
    
  {
     ClockApplet clockApplet = new ClockApplet(); 
     Clock clock = new Clock();
     clock.start();
 
  }    
    
    public void init()
    {
         
    }
 
   
} 





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
package clockapplet;

import java.awt.Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 111
 */
public class Clock extends Thread {
  ClockApplet clockApplet = new ClockApplet();
  
   public void run()
   {
       while (true)
       {
        clockApplet.paint(clockApplet.g);

       try {
           sleep(1000);
       } catch (InterruptedException ex) {
           Logger.getLogger(Clock.class.getName()).log(Level.SEVERE, null, ex);
       }
       }
   }

  
    
}



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

P. S. Число выводимое аплетом не меняется...
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38404780
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java Swing/AWT GUI работает совершенно иначе.
Кроме того что вы сами вызываете метод paint, его так же вызывает paint manager в Java.
Основные ошибки
- Лучше использовать JApplet, хотя и не критично.
- Инкремент нельзя делать в методе paint(). Он может вызываться намного чаще, чем раз в секунду. Вообще начните отделять модель от представления. Счетчик - это модель. Реализация метода paint() это отображение модели.
- sleep здесь не применим. Мы не может точно знать сколько времени заняла отрисовка. Вообще поток мог быть отложен системой на некоторое время. Поэтому таймер должен работать независимо от потоков и синхронизировать своё состояние со счетчиком системного времени.
- Анимация в целом не простая задача в Swing. Можете посмотреть примеры кода в JDK/demo. Но изучать, наверное, лучше было сразу JavaFX.
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38404799
moskov199
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczJava Swing/AWT GUI работает совершенно иначе.
Кроме того что вы сами вызываете метод paint, его так же вызывает paint manager в Java.
Основные ошибки
- Лучше использовать JApplet, хотя и не критично.
- Инкремент нельзя делать в методе paint(). Он может вызываться намного чаще, чем раз в секунду. Вообще начните отделять модель от представления. Счетчик - это модель. Реализация метода paint() это отображение модели.
- sleep здесь не применим. Мы не может точно знать сколько времени заняла отрисовка. Вообще поток мог быть отложен системой на некоторое время. Поэтому таймер должен работать независимо от потоков и синхронизировать своё состояние со счетчиком системного времени.
- Анимация в целом не простая задача в Swing. Можете посмотреть примеры кода в JDK/demo. Но изучать, наверное, лучше было сразу JavaFX.

Ух ты... Теперь понятно почему не работает((. Огромное спасибо за совет!
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38404812
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл написать. Вызывать метод paint() напрямую тоже особого смысла нет. Нужно указать что данные на экране не актуальны и сообщить системе что указанный регион стоило бы перерисовать.
Тут статья:
http://www.oracle.com/technetwork/java/painting-140037.html
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38405108
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moskov199,

sleep(1000) не годиться на роль того самого маятника чтобы регулировать ход часов.
Текущее время нужно получать вызовом системной функции типа System.currentTimeMillis()
и потом форматировать его в ЧЧ:ММ:CC. А sleep можно использовать для периодической анимации
но весьма ограниченно. Кстати sleep не самый удачный вариант для оптимального "простоя" потоков.
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38405113
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА sleep можно использовать для периодической анимации но весьма ограниченно.
Боюсь представить зачем sleep в анимации.
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38405659
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moskov199,

отрисовку нельзя вызывать из постороннего Thread'a непосредственно. Надо обернуть процедуру отрисовки в отдельный Runnable и запускать его на UI Thread с помощью EventQueue.invokeLater .
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38405669
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqотрисовку нельзя вызывать из постороннего Thread'a непосредственно. Надо обернуть процедуру отрисовки в отдельный Runnable и запускать его на UI Thread с помощью EventQueue.invokeLater .
Какой в этом смысл? Отрисовку вообще не стоит дергать напрямую. Даже из EDT. Кстати, чем SwingUtilities не подошли?
Отрисовку дергает инфраструктура тогда когда ей нужно. Вызывать её дополнительно напрямую это верный путь вызвать тормоза приложения. Можно говорить определенному контролу что его состояние поменялось и пора бы обновиться на UI.
А когда будет непосредственно вызвана отрисовка это уже дело Swing/AWT.
...
Рейтинг: 0 / 0
Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
    #38410413
moskov199
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за советы))).
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается создать аплет, который увеличивает число на 1 за 1 секунду. Господа помогите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]