Доброго времени суток!!
Жизнь заставила после 10 лет отбрыкивания от Java таки сесть за её изучение. И сразу же решил написать проект по работе дабы в боевых действиях познать прелести языка. Суть проблемы сводится к подвисанию GUI. Сразу привожу код.
mWindow.java:
| Код | package su.shadowmoon.testcv;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridLayout;
import javax.swing.JButton;
import su.shadowmoon.canvas.Canvas;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class mWindow extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
mWindow frame = new mWindow();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public mWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(1, 0, 0, 0));
Canvas panel = new Canvas();
contentPane.add(panel);
final JButton button = new JButton("0");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
button.setText("" + (Integer.parseInt(button.getText()) + 1));
}
});
contentPane.add(button);
}
}
|
Canvas.java:
| Код | package su.shadowmoon.canvas;
import java.awt.*;
import java.util.Random;
import javax.swing.*;
public class Canvas extends JPanel {
public void Canvas () {
setSize(300, 300);
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawRect(0, 0, 300, 300);
for (int i=0; i<1000000; i++) {
g2.drawLine(
(int)Math.round(-300 + 600*Math.random()),
(int)Math.round(-300 + 600*Math.random()),
(int)Math.round(-300 + 600*Math.random()),
(int)Math.round(-300 + 600*Math.random())
);
}
}
}
|
Прошу сильно не бить, ибо язык почти не знаю - могут быть серьезные огрехи, но логика есть логика. В данном примере, как это видно из кода, JPanel рисует 1000000 количество линий в области 300*300 пикселей. Это сделано для задержки.
Как сделать, чтобы GUI реагировал во время рисования линий? То есть, чтобы работала нажатие на кнопку, считающую количество нажатий на ней. Это элементарный кусок кода, переписаный аналогчно (по принципу работы GUI) реальному приложению, которое должно обрабатывать в реальном времени изображение с камеры и делать фотки по нажатию на кнопку. Но и там, и там GUI просто висит. Знаю, что ответ где-то рядом. Подозреваю, что копать надо в сторону "Is Java threadsafely?". Но с потоками на Java пока туго, ибо куда их тут впихнуть - я хз.
Заранее спасибо. |