0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 43
1

Java пишу мини paint не работает многопоточность

27.07.2013, 11:51. Показов 2377. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане!
Встала такая проблема: пишу мини-графический редактор.

Вот часть кода:



package Classes;

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
import com.sun.javafx.geom.BaseBounds;
import com.sun.javafx.geom.transform.BaseTransform;
import com.sun.javafx.jmx.MXNodeAlgorithm;
import com.sun.javafx.jmx.MXNodeAlgorithmContext;
import com.sun.javafx.sg.PGNode;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseListener;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
 
/**
 * Created with IntelliJ IDEA.
 * User: Mano
 * Date: 27.07.13
 * Time: 9:02
 * To change this template use File | Settings | File Templates.
 */
public class DrawingPane extends JFrame {
    Graphics g;
    PaintThread pt;    
    int x,y, size;
    boolean press;
    public DrawingPane(){
 
        setSize(300,300);
        press = false;
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent e) {
                
            }
 
            @Override
            public void mousePressed(java.awt.event.MouseEvent e) {
                press = true;
                size = 50;
                pt = new PaintThread((int)getMousePosition().getX(),(int)getMousePosition().getY(),DrawingPane.this);
                pt.start();
 
            }
 
            @Override
            public void mouseReleased(java.awt.event.MouseEvent e) {
                press = false;                
                System.out.println(press);
            }
 
            @Override
            public void mouseEntered(java.awt.event.MouseEvent e) {
 
            }
 
            @Override
            public void mouseExited(java.awt.event.MouseEvent e) {
            }
        });
 
    }
    public void paint(Graphics g){
        //super.paint(g);        
        if (pt!= null){
            while(press){               
                g.setColor(Color.BLACK);
                g.fillOval(pt.x-size/2,pt.y-size/2,size,size);
                System.out.println(pt.x+" "+pt.y);
            }
        };
    }
}
 
class PaintThread extends Thread{
    DrawingPane dp;
    public int x,y;
    boolean press;
 
    public PaintThread(int in_x, int in_y, DrawingPane in_dp){
        dp = in_dp;
        x = in_x;
        y = in_y;
        press = false;
    }
    public void reboolean(boolean in_press){
        press = in_press;
        System.out.println(press);
    }
    public void run(){
        SwingUtilities.invokeLater( new Runnable(){
            public void run()
            {                
                dp.repaint();                
 
            }
        });
    }
}


сложность заключается в том, что желательно бы сделать непрерывное рисование (т.е. чтоб
нажатая мышь рисовала непрерывнуб линию)
Для этого из mousePressed - а я открываю новый поток, в нём вызываю рисование, которое зациклено
булевской переменной "press".

Всё бы хорошо, да вот многопоточности не получается.
Программа не хочет выходить из цикла while в функции paint().
Во время её выполнения не изменяется ни значение положения мыши, ни флаг
pressed, находящийся в обработчике мыши в функции mouseReleased

В чём может быть проблема? (Я стажёр в многопоточности, так что может я её не правильно использую?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2013, 11:51
Ответы с готовыми решениями:

Мини paint
Доброго дня. Практикуюсь в GDI, пытаюсь для начала сделать начертание прямоугольника аля paint....

Мини paint - Не обрабатывается событие mouseDown на pictureBox
Какая-то несуразица, почему может не обрабатываться событие mouseDown на pictureBox ? По...

Все моргает при отрисовке Java paint
Вот у меня проблема с отрисовкой в Java, рисую прямо на JFrame, но постоянно все моргает, я конечно...

Пишу на JAVA
238-333-826

8
99 / 99 / 12
Регистрация: 05.05.2013
Сообщений: 1,208
27.07.2013, 11:59 2
mano, я код не смотрел, посмотрел только на импорти. У тебя половина классов с JavaFX, пловина с awt. ))) Или так надо?
0
Заблокирован
27.07.2013, 15:17 3
можно сделать свой слушатель на базе класса MouseAdapter у которого все те же методы плюс метод mouseDragged в котором можно без всяких потоков отрисовывать все что надо
и повесить addMouseMotionListener
1
любитель покушать
686 / 640 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
27.07.2013, 15:33 4
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
package com.sevak_avet.Test;
 
 
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.PixelWriter;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
 
public class GraphicRedactor extends Application {
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) throws Exception {
        Group root = new Group();
        Scene scene = new Scene(root, 400, 300);
 
        Canvas canvas = canvas = new Canvas(400, 300);
        
        root.getChildren().add(canvas);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        final PixelWriter pw = gc.getPixelWriter();
        
        canvas.setOnMouseDragged(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                pw.setColor((int) event.getX(), (int) event.getY(), Color.BLACK);
            }
        });
 
        stage.setScene(scene);
        stage.show();
 
    }
}
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
27.07.2013, 19:17 5
Зачем вообще что-то такое выдумывать, пейнт всегда одинаково делаеться:
при нажатии кнопки мыши запомнить это (flag = true) и сохранить в Point текущие координаты мышки, при движении мыши проверять взведён ли флаг и если да то проводить линию от пред. точки до текущей (где сейчас находиться мышка), приэтом сохранить текущую точку. Когда кнопка мышки отпускаеться flag = false.
1
любитель покушать
686 / 640 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
27.07.2013, 21:03 6
Можно и так, если линия нужна прямая:
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
package com.sevak_avet.Test;
 
 
import java.util.ArrayList;
 
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
 
public class GraphicRedactor extends Application {
    private static ArrayList<Line> lines = new ArrayList<>();
    private static int currentLineIndex = 0;
    
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) throws Exception {
        final Group root = new Group();
        Scene scene = new Scene(root, 400, 300);
        
        scene.setOnMousePressed(new EventHandler<MouseEvent>() {
 
            @Override
            public void handle(MouseEvent e) {
                double x = e.getX();
                double y = e.getY();
                
                Line line = new Line(x, y, x, y);
                root.getChildren().add(line);
                lines.add(line);
                
                currentLineIndex = lines.size() - 1;
            }
        });
        
        scene.setOnMouseDragged(new EventHandler<MouseEvent>() {
 
            @Override
            public void handle(MouseEvent event) {
                Line line = lines.get(currentLineIndex);
                line.setEndX(event.getX());
                line.setEndY(event.getY());
            }
        });
 
        stage.setScene(scene);
        stage.show();
 
    }
}
1
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 43
28.07.2013, 05:39  [ТС] 7
Спасибо, буду мыслить в этом напрвлении...
0
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 43
29.07.2013, 09:54  [ТС] 8
А как сохранять нарисованное в Canvas?
0
любитель покушать
686 / 640 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
29.07.2013, 12:20 9
Java
1
2
3
4
5
6
7
8
9
10
11
12
FileChooser fileChooser = new FileChooser();
File imageFile = fileChooser.showSaveDialog(mainStage);
    if(imageFile != null) {
        try {
            WritableImage image = new WritableImage(500, 500);
            canvas.snapshot(null, image);
            RenderedImage renderedImage = SwingFXUtils.fromFXImage(image, null);
            ImageIO.write(renderedImage, "png", imageFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2013, 12:20
Помогаю со студенческими работами здесь

Пишу змейку на Java
Прошу строго не судить :) C_R0zgvkdtg

Многопоточность Java
Помогите с заданием. В текстовом файле записаны слова (для простоты – в каждой строке одно слово)....

Многопоточность в java
Добрый день. Появился вопрос по многопоточности: Есть 3 класса: public class main { public...

Многопоточность Rx Java, туплю
Что-то я туплю Задача: 1) Обращаемся в базу данных и получаем первую пачку данных 2)...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru