Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java GUI
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Ostraya
0 / 0 / 1
Регистрация: 25.04.2011
Сообщений: 3
#1

Отрисовка изображения в потоке - Java

23.06.2012, 13:34. Просмотров 1416. Ответов 1
Метки нет (Все метки)

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.util.*;
 
class MainWndFrame extends Frame {  // класс окна приложения
 
    public MainWndFrame(String str) {
        super (str);
    }
 
    public boolean handleEvent(Event evt){
        switch (evt.id) {
            case Event.WINDOW_DESTROY: dispose();
            System.exit(0);
            return true;
            default: return super.handleEvent(evt);
        }
    }
}
 
public class Main extends Applet {  // Основной класс приложения
        private Image[] images;     // массив картинок
        private int imgPosition = 0;    // индекс изображения
        private Thread timerThread;     // таймер-поток для смены изображения
        private boolean noStopRequested; // флаг продолжения смены картинок
        private boolean paused;         // флаг приостановки
// объект-монитор для последовательного выполнения
        private Object pauseLock = new Object();
//главная функция
        public static void main(String args[]) {
            MainWndFrame frame = new MainWndFrame("Курсовая Работа");
            frame.show(); frame.hide();
            frame.resize(400, 300);
            Main applet_Combi = new Main();
            frame.add("Center", applet_Combi);
            applet_Combi.init();
            applet_Combi.start();
            frame.show();
        }
// инициализация апплета
        public void init(){
            resize(400,300);
 
            images = new Image[5];
 
            // полные пути до изображений, учитывая каталог апплета
            URL base = null;
            try {
                base= getCodeBase();
             
                images[1] = getImage(base,"1.jpg");
                images[2] = getImage(base,"2.jpg");
                images[2] = getImage(base,"3.jpg");
                images[2] = getImage(base,"4.jpg");
            } catch(Exception e) {
            }
            repaint(); // первая отрисовка изображения
        }
 
        private void startThread(){  //старт runWork в новом потоке
                paused = false;
                noStopRequested = true;
 
                Runnable r = new Runnable(){
                        public void run(){
                                runWork();
                        }
                };
                timerThread = new Thread(r, "Timer");
                timerThread.start();
        }
 
        private void stopThread(){  //прерывание потока 
                noStopRequested = false;
                timerThread.interrupt();
        }
 
        // реализация смены картинок (надписей): зацикливание по индексу
        private void runWork(){
                try{
                   while(noStopRequested){
                           waitWhilePaused();
                           imgPosition = ( imgPosition + 1 ) % images.length;
                           repaint();
                           Thread.sleep(800); // пауза 800 милисекунд
                        }
                }catch(InterruptedException x){ // остановка по ошибке
                        Thread.currentThread().interrupt();
                        System.out.println("interrupt and return from run");
                }
        }
 
// в объект-монитор зашёл сторонний поток и состояние ожидания снимается
// активизирует все ожидающие потоки, вызвавшие метод wait() того же объекта
        private void setPaused(boolean newPauseState){
                synchronized(pauseLock){
                        if(paused != newPauseState){
                           paused = newPauseState;
                           pauseLock.notifyAll();
                        }
                }
        }
 
        private void waitWhilePaused() throws InterruptedException{
                synchronized(pauseLock){
                        while(paused){
                                // предписывает вызвавшему потоку отдать мони-тор и перейти в состояние ожидания,
                                // пока какой-нибудь другой поток не войдет в тот же монитор и не вызовет метод notify()
                                pauseLock.wait();
                        }
                }
        }
 
        // событие отрисовки апплета
        public void paint(Graphics g){
            update(g);
        }
        // очистка апплета, вывод строки, если картинка загрузилась – 
        // поверх рисуется картинка
        public void update(Graphics g){
            g.clearRect(0,0,300,400);
            g.drawString("there must be piture#"+imgPosition+"", 20, 20);
            g.drawImage(images[imgPosition], 0, 0, this);
        }
 
        // событие запуска активности апплета
        public void start(){
                setPaused(false);
        }
 
        // событие остановки активности апплета
        public void stop(){
                setPaused(true);
        }
 
        // деструктор апплета – очистить память выделенную под картинки
        public void destroy(){
                stopThread();
 
                for (int i = 0; i < images.length; i++){
                        images[i].flush();
                        images[i] = null;
                }
 
                images = null;
        }
 
    public boolean mouseDown(Event evt, int x, int y) {
        return true;
    }
 
    public boolean mouseUp(Event evt, int x, int y){
        return true;
    }
 
    public boolean mouseDrag(Event evt, int x, int y){
        return true;
    }
 
    public boolean mouseMove(Event evt, int x, int y){
        return true;
    }
 
    public boolean mouseEnter(Event evt, int x, int y){ //мышь в апплете
        startThread();
        start();
        return true;
    }
 
    public boolean mouseExit(Event evt, int x, int y){ // мышь вне апплета
        stopThread();
        stop();
        return true;
    }
}

задание:Реализация многопоточности. Создать апплет (или приложение), в ок-не которого выводится ряд подготовленных изображений (мультипли-кация). Последовательное изменение выводимых изображений должно происходит только тогда, когда курсор мыши находится в окне аппле-та (или приложения). При выходе курсора за границы окна вывод изо-бражения приостанавливается.
http://www.cyberforum.ru/java-gui/thread115121.html

у меня,почему то,не отображаются картинки,а только их названия(1,2,3,4),не могу понять почему!!!!пожалуйста подскажите где ошибка!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 13:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Отрисовка изображения в потоке (Java):

Отрисовка изображения на canvas происходит только при повторном нажатии клавиши
В программе по нажатию клавиши происходит, точнее должна происходить отрисовка...

Отрисовка
Доброго времени суток! Есть пара вопросов, добавлено несколько панелей:...

Отрисовка
Возникла небольшая проблема, панель в фрейме отрисовывается с толчка, примерно...

Отрисовка
привет! вообщем я пытался найти через что можно было бы сделать, но...

Отрисовка JProgressBar
Есть примерно такой код: JFrame frame = new JFrame(); JProgressBar pb = new...

1
Demyen
0 / 0 / 0
Регистрация: 22.05.2014
Сообщений: 3
04.06.2014, 08:00 #2
Здравствуйте. У меня к вам вопрос. Как вы справились с данной проблемой. У меня тоже ни как не получается вывести изображение?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2014, 08:00
Привет! Вот еще темы с решениями:

Отрисовка строк
Есть код, который должен выводить на экран апплета массив строк, при этом...

Отрисовка таблиц
Есть несколько моделей таблицы, на панельке главного окна есть бар с кнопками,...

Отрисовка графики
Привет всем. Пытаюсь нарисовать n-ное количество фигур. Каждая фигура должна...

Отрисовка с буфером
Здравствуйте. Есть код: import java.awt.image.BufferedImage; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru