summaryrefslogtreecommitdiffstats
path: root/qtjava/javalib/tutorial
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit90825e2392b2d70e43c7a25b8a3752299a933894 (patch)
treee33aa27f02b74604afbfd0ea4f1cfca8833d882a /qtjava/javalib/tutorial
downloadtdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.tar.gz
tdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebindings@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'qtjava/javalib/tutorial')
-rw-r--r--qtjava/javalib/tutorial/t1/Tut1.java22
-rw-r--r--qtjava/javalib/tutorial/t10/CannonField.java72
-rw-r--r--qtjava/javalib/tutorial/t10/LCDRange.java38
-rw-r--r--qtjava/javalib/tutorial/t10/Tut10.java63
-rw-r--r--qtjava/javalib/tutorial/t11/CannonField.java140
-rw-r--r--qtjava/javalib/tutorial/t11/LCDRange.java38
-rw-r--r--qtjava/javalib/tutorial/t11/Tut11.java74
-rw-r--r--qtjava/javalib/tutorial/t12/CannonField.java173
-rw-r--r--qtjava/javalib/tutorial/t12/LCDRange.java56
-rw-r--r--qtjava/javalib/tutorial/t12/Tut12.java74
-rw-r--r--qtjava/javalib/tutorial/t13/CannonField.java210
-rw-r--r--qtjava/javalib/tutorial/t13/GameBoard.java108
-rw-r--r--qtjava/javalib/tutorial/t13/LCDRange.java61
-rw-r--r--qtjava/javalib/tutorial/t13/Tut13.java24
-rw-r--r--qtjava/javalib/tutorial/t14/CannonField.java261
-rw-r--r--qtjava/javalib/tutorial/t14/GameBoard.java118
-rw-r--r--qtjava/javalib/tutorial/t14/LCDRange.java61
-rw-r--r--qtjava/javalib/tutorial/t14/Tut14.java24
-rw-r--r--qtjava/javalib/tutorial/t2/Tut2.java25
-rw-r--r--qtjava/javalib/tutorial/t3/Tut3.java28
-rw-r--r--qtjava/javalib/tutorial/t4/Tut4.java33
-rw-r--r--qtjava/javalib/tutorial/t5/Tut5.java37
-rw-r--r--qtjava/javalib/tutorial/t6/LCDRange.java15
-rw-r--r--qtjava/javalib/tutorial/t6/Tut6.java35
-rw-r--r--qtjava/javalib/tutorial/t7/LCDRange.java29
-rw-r--r--qtjava/javalib/tutorial/t7/Tut7.java42
-rw-r--r--qtjava/javalib/tutorial/t8/CannonField.java37
-rw-r--r--qtjava/javalib/tutorial/t8/LCDRange.java38
-rw-r--r--qtjava/javalib/tutorial/t8/Tut8.java51
-rw-r--r--qtjava/javalib/tutorial/t9/CannonField.java43
-rw-r--r--qtjava/javalib/tutorial/t9/LCDRange.java38
-rw-r--r--qtjava/javalib/tutorial/t9/Tut9.java52
32 files changed, 2120 insertions, 0 deletions
diff --git a/qtjava/javalib/tutorial/t1/Tut1.java b/qtjava/javalib/tutorial/t1/Tut1.java
new file mode 100644
index 00000000..dbb95131
--- /dev/null
+++ b/qtjava/javalib/tutorial/t1/Tut1.java
@@ -0,0 +1,22 @@
+import org.kde.qt.*;
+
+public class Tut1 extends QObject {
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+ QPushButton hello = new QPushButton("Hello World!", null);
+ hello.resize(100, 30);
+
+ a.setMainWidget(hello);
+ hello.show();
+ a.exec();
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t10/CannonField.java b/qtjava/javalib/tutorial/t10/CannonField.java
new file mode 100644
index 00000000..3f6e2727
--- /dev/null
+++ b/qtjava/javalib/tutorial/t10/CannonField.java
@@ -0,0 +1,72 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+ private int f;
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public int force() {
+ return f;
+ }
+
+ public void setForce(int newton) {
+ if (newton < 0)
+ newton = 0;
+ if (f == newton)
+ return;
+ f = newton;
+ emit("forceChanged", f);
+ }
+
+ private QRect cannonRect() {
+ QRect r = new QRect(0, 0, 50, 50);
+ r.moveBottomLeft(rect().bottomLeft());
+ return r;
+ }
+
+ public void paintEvent(QPaintEvent e) {
+ if (!e.rect().intersects(cannonRect()))
+ return;
+
+ QRect cr = cannonRect();
+ QPixmap pix = new QPixmap(cr.size());
+ pix.fill(new QColor(250, 250, 200));
+
+ QPainter p = new QPainter(pix);
+ p.setBrush(blue());
+ p.setPen(NoPen);
+ p.translate(0, pix.height() - 1);
+ p.drawPie(new QRect(-35,-35, 70, 70), 0, 90*16);
+ p.rotate(-ang);
+ p.drawRect(new QRect(33, -4, 15, 8));
+ p.end();
+
+ p.begin(this);
+ p.drawPixmap(cr.topLeft(), pix);
+ }
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t10/LCDRange.java b/qtjava/javalib/tutorial/t10/LCDRange.java
new file mode 100644
index 00000000..7bbb9886
--- /dev/null
+++ b/qtjava/javalib/tutorial/t10/LCDRange.java
@@ -0,0 +1,38 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ private QSlider slider;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t10/Tut10.java b/qtjava/javalib/tutorial/t10/Tut10.java
new file mode 100644
index 00000000..f9141636
--- /dev/null
+++ b/qtjava/javalib/tutorial/t10/Tut10.java
@@ -0,0 +1,63 @@
+import org.kde.qt.*;
+
+public class Tut10 extends QWidget {
+ public Tut10() {
+ QPushButton quit = new QPushButton("&Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange(this, "angle");
+ angle.setRange(5, 70);
+
+ LCDRange force = new LCDRange(this, "force");
+ force.setRange(10, 50);
+
+ CannonField cannonField = new CannonField(this, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ connect(force, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setForce(int)"));
+ connect(cannonField, SIGNAL("forceChanged(int)"),
+ force, SLOT("setValue(int)"));
+
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(cannonField, 1, 1);
+ grid.setColStretch(1, 10);
+
+ QVBoxLayout leftBox = new QVBoxLayout();
+ grid.addLayout(leftBox, 1, 0);
+ leftBox.addWidget(angle);
+ leftBox.addWidget(force);
+
+ angle.setValue(60);
+ force.setValue(25);
+ angle.setFocus();
+ }
+
+ public static void main(String[] args) {
+ QApplication.setColorSpec(QApplication.CustomColor);
+ QApplication a = new QApplication(args);
+ Tut10 w = new Tut10();
+ w.setGeometry( 100, 100, 500, 355 );
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t11/CannonField.java b/qtjava/javalib/tutorial/t11/CannonField.java
new file mode 100644
index 00000000..fc2569ad
--- /dev/null
+++ b/qtjava/javalib/tutorial/t11/CannonField.java
@@ -0,0 +1,140 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+ private int f;
+
+ private int timerCount;
+ private QTimer autoShootTimer;
+ private float shoot_ang;
+ private float shoot_f;
+ private final QRect barrelRect = new QRect(33, -4, 15, 8);
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ f = 0;
+ timerCount = 0;
+ autoShootTimer = new QTimer(this, "movement handler");
+ connect(autoShootTimer, SIGNAL("timeout()"),
+ this, SLOT("moveShot()"));
+ shoot_ang = 0;
+ shoot_f = 0;
+
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public int force() {
+ return f;
+ }
+
+ public void setForce(int newton) {
+ if (newton < 0)
+ newton = 0;
+ if (f == newton)
+ return;
+ f = newton;
+ emit("forceChanged", f);
+ }
+
+ public void shoot() {
+ if (autoShootTimer.isActive())
+ return;
+ timerCount = 0;
+ shoot_ang = ang;
+ shoot_f = f;
+ autoShootTimer.start(50);
+ }
+
+ public void moveShot() {
+ QRegion r = new QRegion(shotRect());
+ timerCount++;
+
+ QRect shotR = shotRect();
+
+ if (shotR.x() > width() || shotR.y() > height())
+ autoShootTimer.stop();
+ else
+ r = r.unite(new QRegion(shotR));
+ repaint(r);
+ }
+
+ public void paintEvent(QPaintEvent e) {
+ QRect updateR = e.rect();
+ QPainter p = new QPainter(this);
+
+ if (updateR.intersects(cannonRect()))
+ paintCannon(p);
+ if (autoShootTimer.isActive() && updateR.intersects(shotRect()))
+ paintShot(p);
+ }
+
+ private void paintShot(QPainter p) {
+ p.setBrush(black());
+ p.setPen(NoPen);
+ p.drawRect(shotRect());
+ }
+
+ private void paintCannon(QPainter p) {
+ QRect cr = cannonRect();
+ QPixmap pix = new QPixmap(cr.size());
+ pix.fill(new QColor(250, 250, 200));
+
+ QPainter tmp = new QPainter(pix);
+ tmp.setBrush(blue());
+ tmp.setPen(NoPen);
+
+ tmp.translate(0, pix.height() - 1);
+ tmp.drawPie(new QRect(-35,-35, 70, 70), 0, 90*16);
+ tmp.rotate(-ang);
+ tmp.drawRect(barrelRect);
+ tmp.end();
+
+ p.drawPixmap(cr.topLeft(), pix);
+ }
+
+ private QRect cannonRect() {
+ QRect r = new QRect(0, 0, 50, 50);
+ r.moveBottomLeft(rect().bottomLeft());
+ return r;
+ }
+
+ private QRect shotRect() {
+ final double gravity = 4;
+
+ double time = timerCount / 4.0;
+ double velocity = shoot_f;
+ double radians = shoot_ang*3.14159265/180;
+
+ double velx = velocity*Math.cos(radians);
+ double vely = velocity*Math.sin(radians);
+ double x0 = (barrelRect.right() + 5)*Math.cos(radians);
+ double y0 = (barrelRect.right() + 5)*Math.sin(radians);
+ double x = x0 + velx*time;
+ double y = y0 + vely*time - 0.5*gravity*time*time;
+
+ QRect r = new QRect(0, 0, 6, 6);
+ r.moveCenter(new QPoint((int) x, height() - 1 - (int) y));
+ return r;
+}
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t11/LCDRange.java b/qtjava/javalib/tutorial/t11/LCDRange.java
new file mode 100644
index 00000000..7bbb9886
--- /dev/null
+++ b/qtjava/javalib/tutorial/t11/LCDRange.java
@@ -0,0 +1,38 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ private QSlider slider;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t11/Tut11.java b/qtjava/javalib/tutorial/t11/Tut11.java
new file mode 100644
index 00000000..b64fcdbe
--- /dev/null
+++ b/qtjava/javalib/tutorial/t11/Tut11.java
@@ -0,0 +1,74 @@
+import org.kde.qt.*;
+
+public class Tut11 extends QWidget {
+ public Tut11() {
+ QPushButton quit = new QPushButton("&Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange(this, "angle");
+ angle.setRange(5, 70);
+
+ LCDRange force = new LCDRange(this, "force");
+ force.setRange(10, 50);
+
+ CannonField cannonField = new CannonField(this, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ connect(force, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setForce(int)"));
+ connect(cannonField, SIGNAL("forceChanged(int)"),
+ force, SLOT("setValue(int)"));
+
+
+ QPushButton shoot = new QPushButton("&Shoot", this, "shoot");
+ shoot.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(shoot, SIGNAL("clicked()"), cannonField, SLOT("shoot()"));
+
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(cannonField, 1, 1);
+ grid.setColStretch(1, 10);
+
+ QVBoxLayout leftBox = new QVBoxLayout();
+ grid.addLayout(leftBox, 1, 0);
+ leftBox.addWidget(angle);
+ leftBox.addWidget(force);
+
+ QHBoxLayout topBox = new QHBoxLayout();
+ grid.addLayout(topBox, 0, 1);
+ topBox.addWidget(shoot);
+ topBox.addStretch(1);
+
+ angle.setValue(60);
+ force.setValue(25);
+ angle.setFocus();
+ }
+
+ public static void main(String[] args) {
+ QApplication.setColorSpec(QApplication.CustomColor);
+ QApplication a = new QApplication(args);
+ Tut11 w = new Tut11();
+ w.setGeometry( 100, 100, 500, 355 );
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t12/CannonField.java b/qtjava/javalib/tutorial/t12/CannonField.java
new file mode 100644
index 00000000..28077c15
--- /dev/null
+++ b/qtjava/javalib/tutorial/t12/CannonField.java
@@ -0,0 +1,173 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+ private int f;
+
+ private int timerCount;
+ private QTimer autoShootTimer;
+ private float shoot_ang;
+ private float shoot_f;
+
+ private QPoint target;
+
+ private final QRect barrelRect = new QRect(33, -4, 15, 8);
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ f = 0;
+ timerCount = 0;
+ autoShootTimer = new QTimer(this, "movement handler");
+ connect(autoShootTimer, SIGNAL("timeout()"),
+ this, SLOT("moveShot()"));
+ shoot_ang = 0;
+ shoot_f = 0;
+ target = new QPoint(0, 0);
+
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ newTarget();
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public int force() {
+ return f;
+ }
+
+ public void setForce(int newton) {
+ if (newton < 0)
+ newton = 0;
+ if (f == newton)
+ return;
+ f = newton;
+ emit("forceChanged", f);
+ }
+
+ public void shoot() {
+ if (autoShootTimer.isActive())
+ return;
+ timerCount = 0;
+ shoot_ang = ang;
+ shoot_f = f;
+ autoShootTimer.start(50);
+ }
+
+ public void newTarget() {
+ QRegion r = new QRegion(targetRect());
+ target = new QPoint((int) (200 + Math.random()*190),
+ (int) (10 + Math.random()*255));
+ repaint(r.unite(new QRegion(targetRect())));
+ }
+
+ public void moveShot() {
+ QRegion r = new QRegion(shotRect());
+ timerCount++;
+
+ QRect shotR = shotRect();
+
+ if (shotR.intersects(targetRect())) {
+ autoShootTimer.stop();
+ emit("hit");
+ } else if (shotR.x() > width() || shotR.y() > height()) {
+ autoShootTimer.stop();
+ emit("missed");
+ } else {
+ r = r.unite(new QRegion(shotR));
+ }
+
+ repaint(r);
+ }
+
+ public void paintEvent(QPaintEvent e) {
+ QRect updateR = e.rect();
+ QPainter p = new QPainter(this);
+
+ if (updateR.intersects(cannonRect()))
+ paintCannon(p);
+ if (autoShootTimer.isActive() && updateR.intersects(shotRect()))
+ paintShot(p);
+ if (updateR.intersects(targetRect()))
+ paintTarget(p);
+ }
+
+ private void paintShot(QPainter p) {
+ p.setBrush(black());
+ p.setPen(NoPen);
+ p.drawRect(shotRect());
+ }
+
+ private void paintTarget(QPainter p) {
+ p.setBrush(red());
+ p.setPen(black());
+ p.drawRect(targetRect());
+ }
+
+
+ private void paintCannon(QPainter p) {
+ QRect cr = cannonRect();
+ QPixmap pix = new QPixmap(cr.size());
+ pix.fill(new QColor(250, 250, 200));
+
+ QPainter tmp = new QPainter(pix);
+ tmp.setBrush(blue());
+ tmp.setPen(NoPen);
+
+ tmp.translate(0, pix.height() - 1);
+ tmp.drawPie(new QRect(-35,-35, 70, 70), 0, 90*16);
+ tmp.rotate(-ang);
+ tmp.drawRect(barrelRect);
+ tmp.end();
+
+ p.drawPixmap(cr.topLeft(), pix);
+ }
+
+ private QRect cannonRect() {
+ QRect r = new QRect(0, 0, 50, 50);
+ r.moveBottomLeft(rect().bottomLeft());
+ return r;
+ }
+
+ private QRect shotRect() {
+ final double gravity = 4;
+
+ double time = timerCount / 4.0;
+ double velocity = shoot_f;
+ double radians = shoot_ang*3.14159265/180;
+
+ double velx = velocity*Math.cos(radians);
+ double vely = velocity*Math.sin(radians);
+ double x0 = (barrelRect.right() + 5)*Math.cos(radians);
+ double y0 = (barrelRect.right() + 5)*Math.sin(radians);
+ double x = x0 + velx*time;
+ double y = y0 + vely*time - 0.5*gravity*time*time;
+
+ QRect r = new QRect(0, 0, 6, 6);
+ r.moveCenter(new QPoint((int) x, height() - 1 - (int) y));
+ return r;
+ }
+
+ private QRect targetRect() {
+ QRect r = new QRect(0, 0, 20, 10);
+ r.moveCenter(new QPoint(target.x(),height() - 1 - target.y()));
+ return r;
+ }
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t12/LCDRange.java b/qtjava/javalib/tutorial/t12/LCDRange.java
new file mode 100644
index 00000000..3211120b
--- /dev/null
+++ b/qtjava/javalib/tutorial/t12/LCDRange.java
@@ -0,0 +1,56 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ private QSlider slider;
+ private QLabel label;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ init();
+ }
+
+ public LCDRange(String s, QWidget parent, String name) {
+ super(parent, name);
+ init();
+ setText(s);
+ }
+
+ private void init() {
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ label = new QLabel(" ", this, "label", 0);
+ label.setAlignment(AlignCenter);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+
+ public void setText(String s) {
+ label.setText(s);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t12/Tut12.java b/qtjava/javalib/tutorial/t12/Tut12.java
new file mode 100644
index 00000000..eb0dc917
--- /dev/null
+++ b/qtjava/javalib/tutorial/t12/Tut12.java
@@ -0,0 +1,74 @@
+import org.kde.qt.*;
+
+public class Tut12 extends QWidget {
+ public Tut12() {
+ QPushButton quit = new QPushButton("&Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange("ANGLE", this, "angle");
+ angle.setRange(5, 70);
+
+ LCDRange force = new LCDRange("FORCE", this, "force");
+ force.setRange(10, 50);
+
+ CannonField cannonField = new CannonField(this, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ connect(force, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setForce(int)"));
+ connect(cannonField, SIGNAL("forceChanged(int)"),
+ force, SLOT("setValue(int)"));
+
+
+ QPushButton shoot = new QPushButton("&Shoot", this, "shoot");
+ shoot.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(shoot, SIGNAL("clicked()"), cannonField, SLOT("shoot()"));
+
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(cannonField, 1, 1);
+ grid.setColStretch(1, 10);
+
+ QVBoxLayout leftBox = new QVBoxLayout();
+ grid.addLayout(leftBox, 1, 0);
+ leftBox.addWidget(angle);
+ leftBox.addWidget(force);
+
+ QHBoxLayout topBox = new QHBoxLayout();
+ grid.addLayout(topBox, 0, 1);
+ topBox.addWidget(shoot);
+ topBox.addStretch(1);
+
+ angle.setValue(60);
+ force.setValue(25);
+ angle.setFocus();
+ }
+
+ public static void main(String[] args) {
+ QApplication.setColorSpec(QApplication.CustomColor);
+ QApplication a = new QApplication(args);
+ Tut12 w = new Tut12();
+ w.setGeometry( 100, 100, 500, 355 );
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t13/CannonField.java b/qtjava/javalib/tutorial/t13/CannonField.java
new file mode 100644
index 00000000..9a3253df
--- /dev/null
+++ b/qtjava/javalib/tutorial/t13/CannonField.java
@@ -0,0 +1,210 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+ private int f;
+
+ private int timerCount;
+ private QTimer autoShootTimer;
+ private float shoot_ang;
+ private float shoot_f;
+
+ private QPoint target;
+
+ private boolean gameEnded;
+
+ private final QRect barrelRect = new QRect(33, -4, 15, 8);
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ f = 0;
+ timerCount = 0;
+ autoShootTimer = new QTimer(this, "movement handler");
+ connect(autoShootTimer, SIGNAL("timeout()"),
+ this, SLOT("moveShot()"));
+ shoot_ang = 0;
+ shoot_f = 0;
+ target = new QPoint(0, 0);
+ gameEnded = false;
+
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ newTarget();
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public int force() {
+ return f;
+ }
+
+ public void setForce(int newton) {
+ if (newton < 0)
+ newton = 0;
+ if (f == newton)
+ return;
+ f = newton;
+ emit("forceChanged", f);
+ }
+
+ public void shoot() {
+ if (isShooting())
+ return;
+ timerCount = 0;
+ shoot_ang = ang;
+ shoot_f = f;
+ autoShootTimer.start(50);
+ emit("canShoot", false);
+ }
+
+ public void newTarget() {
+ QRegion r = new QRegion(targetRect());
+ target = new QPoint((int) (200 + Math.random()*190),
+ (int) (10 + Math.random()*255));
+ repaint(r.unite(new QRegion(targetRect())));
+ }
+
+ public void setGameOver() {
+ if (gameEnded)
+ return;
+ if (isShooting())
+ autoShootTimer.stop();
+ gameEnded = true;
+ repaint();
+ }
+
+ public boolean gameOver() {
+ return gameEnded;
+ }
+
+ public void restartGame() {
+ if (isShooting())
+ autoShootTimer.stop();
+ gameEnded = false;
+ repaint();
+ emit("canShoot", true);
+ }
+
+
+ public void moveShot() {
+ QRegion r = new QRegion(shotRect());
+ timerCount++;
+
+ QRect shotR = shotRect();
+
+ if (shotR.intersects(targetRect())) {
+ autoShootTimer.stop();
+ emit("hit");
+ emit("canShoot", true);
+ } else if (shotR.x() > width() || shotR.y() > height()) {
+ autoShootTimer.stop();
+ emit("missed");
+ emit("canShoot", true);
+ } else {
+ r = r.unite(new QRegion(shotR));
+ }
+
+ repaint(r);
+ }
+
+ protected void paintEvent(QPaintEvent e) {
+ QRect updateR = e.rect();
+ QPainter p = new QPainter(this);
+
+ if (gameEnded) {
+ p.setPen(black());
+ p.setFont(new QFont("Courier", 48, QFont.Bold, false));
+ p.drawText(rect(), AlignCenter, "Game Over");
+ }
+ if (updateR.intersects(cannonRect()))
+ paintCannon(p);
+ if (isShooting() && updateR.intersects(shotRect()))
+ paintShot(p);
+ if (!gameEnded && updateR.intersects(targetRect()))
+ paintTarget(p);
+ }
+
+ private void paintShot(QPainter p) {
+ p.setBrush(black());
+ p.setPen(NoPen);
+ p.drawRect(shotRect());
+ }
+
+ private void paintTarget(QPainter p) {
+ p.setBrush(red());
+ p.setPen(black());
+ p.drawRect(targetRect());
+ }
+
+
+ private void paintCannon(QPainter p) {
+ QRect cr = cannonRect();
+ QPixmap pix = new QPixmap(cr.size());
+ pix.fill(new QColor(250, 250, 200));
+
+ QPainter tmp = new QPainter(pix);
+ tmp.setBrush(blue());
+ tmp.setPen(NoPen);
+
+ tmp.translate(0, pix.height() - 1);
+ tmp.drawPie(new QRect(-35,-35, 70, 70), 0, 90*16);
+ tmp.rotate(-ang);
+ tmp.drawRect(barrelRect);
+ tmp.end();
+
+ p.drawPixmap(cr.topLeft(), pix);
+ }
+
+ private QRect cannonRect() {
+ QRect r = new QRect(0, 0, 50, 50);
+ r.moveBottomLeft(rect().bottomLeft());
+ return r;
+ }
+
+ private QRect shotRect() {
+ final double gravity = 4;
+
+ double time = timerCount / 4.0;
+ double velocity = shoot_f;
+ double radians = shoot_ang*3.14159265/180;
+
+ double velx = velocity*Math.cos(radians);
+ double vely = velocity*Math.sin(radians);
+ double x0 = (barrelRect.right() + 5)*Math.cos(radians);
+ double y0 = (barrelRect.right() + 5)*Math.sin(radians);
+ double x = x0 + velx*time;
+ double y = y0 + vely*time - 0.5*gravity*time*time;
+
+ QRect r = new QRect(0, 0, 6, 6);
+ r.moveCenter(new QPoint((int) x, height() - 1 - (int) y));
+ return r;
+ }
+
+ private QRect targetRect() {
+ QRect r = new QRect(0, 0, 20, 10);
+ r.moveCenter(new QPoint(target.x(),height() - 1 - target.y()));
+ return r;
+ }
+
+ public boolean isShooting() {
+ return autoShootTimer.isActive();
+ }
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t13/GameBoard.java b/qtjava/javalib/tutorial/t13/GameBoard.java
new file mode 100644
index 00000000..6e44c20f
--- /dev/null
+++ b/qtjava/javalib/tutorial/t13/GameBoard.java
@@ -0,0 +1,108 @@
+import org.kde.qt.*;
+
+public class GameBoard extends QWidget {
+ private QLCDNumber hits;
+ private QLCDNumber shotsLeft;
+ private CannonField cannonField;
+
+ public GameBoard() {
+ QPushButton quit = new QPushButton("&Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange("ANGLE", this, "angle");
+ angle.setRange(5, 70);
+
+ LCDRange force = new LCDRange("FORCE", this, "force");
+ force.setRange(10, 50);
+
+ cannonField = new CannonField(this, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ connect(force, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setForce(int)"));
+ connect(cannonField, SIGNAL("forceChanged(int)"),
+ force, SLOT("setValue(int)"));
+
+ connect(cannonField, SIGNAL("hit()"),
+ this, SLOT("hit()"));
+ connect(cannonField, SIGNAL("missed()"),
+ this, SLOT("missed()"));
+
+ QPushButton shoot = new QPushButton("&Shoot", this, "shoot");
+ shoot.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(shoot, SIGNAL("clicked()"), SLOT("fire()"));
+ connect(cannonField, SIGNAL("canShoot(boolean)"),
+ shoot, SLOT("setEnabled(boolean)"));
+
+ QPushButton restart = new QPushButton("&New Game", this, "newgame");
+ restart.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(restart, SIGNAL("clicked()"), this, SLOT("newGame()"));
+
+ hits = new QLCDNumber(2, this, "hits");
+ shotsLeft = new QLCDNumber(2, this, "shotsleft");
+ QLabel hitsL = new QLabel("HITS", this, "hitsLabel", 0);
+ QLabel shotsLeftL = new QLabel("SHOTS LEFT", this, "shotsleftLabel", 0);
+
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(cannonField, 1, 1);
+ grid.setColStretch(1, 10);
+
+ QVBoxLayout leftBox = new QVBoxLayout();
+ grid.addLayout(leftBox, 1, 0);
+ leftBox.addWidget(angle);
+ leftBox.addWidget(force);
+
+ QHBoxLayout topBox = new QHBoxLayout();
+ grid.addLayout(topBox, 0, 1);
+ topBox.addWidget(shoot);
+ topBox.addWidget(hits);
+ topBox.addWidget(hitsL);
+ topBox.addWidget(shotsLeft);
+ topBox.addWidget(shotsLeftL);
+ topBox.addStretch(1);
+ topBox.addWidget(restart);
+
+ angle.setValue(60);
+ force.setValue(25);
+ angle.setFocus();
+
+ newGame();
+ }
+
+ protected void fire() {
+ if (cannonField.gameOver() || cannonField.isShooting())
+ return;
+ shotsLeft.display(shotsLeft.intValue() - 1);
+ cannonField.shoot();
+ }
+
+ protected void hit() {
+ hits.display(hits.intValue() + 1);
+ if (shotsLeft.intValue() == 0)
+ cannonField.setGameOver();
+ else
+ cannonField.newTarget();
+ }
+
+ protected void missed() {
+ if (shotsLeft.intValue() == 0)
+ cannonField.setGameOver();
+ }
+
+ protected void newGame() {
+ shotsLeft.display(15);
+ hits.display(0);
+ cannonField.restartGame();
+ cannonField.newTarget();
+ }
+
+}
diff --git a/qtjava/javalib/tutorial/t13/LCDRange.java b/qtjava/javalib/tutorial/t13/LCDRange.java
new file mode 100644
index 00000000..bf5001db
--- /dev/null
+++ b/qtjava/javalib/tutorial/t13/LCDRange.java
@@ -0,0 +1,61 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QWidget {
+ private QSlider slider;
+ private QLabel label;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ init();
+ }
+
+ public LCDRange(String s, QWidget parent, String name) {
+ super(parent, name);
+ init();
+ setText(s);
+ }
+
+ private void init() {
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ label = new QLabel(" ", this, "label", 0);
+ label.setAlignment(AlignCenter);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+
+ QVBoxLayout l = new QVBoxLayout(this);
+ l.addWidget(lcd, 1);
+ l.addWidget(slider);
+ l.addWidget(label);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+
+ public void setText(String s) {
+ label.setText(s);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t13/Tut13.java b/qtjava/javalib/tutorial/t13/Tut13.java
new file mode 100644
index 00000000..ceb0d84d
--- /dev/null
+++ b/qtjava/javalib/tutorial/t13/Tut13.java
@@ -0,0 +1,24 @@
+import org.kde.qt.*;
+
+public class Tut13 extends QObject {
+ public static void main(String[] args) {
+ QApplication.setColorSpec(QApplication.CustomColor);
+ QApplication a = new QApplication(args);
+
+ GameBoard gb = new GameBoard();
+ gb.setGeometry(100, 100, 500, 355);
+ a.setMainWidget(gb);
+ gb.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t14/CannonField.java b/qtjava/javalib/tutorial/t14/CannonField.java
new file mode 100644
index 00000000..1ace9c78
--- /dev/null
+++ b/qtjava/javalib/tutorial/t14/CannonField.java
@@ -0,0 +1,261 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+ private int f;
+
+ private int timerCount;
+ private QTimer autoShootTimer;
+ private float shoot_ang;
+ private float shoot_f;
+
+ private QPoint target;
+
+ private boolean gameEnded;
+ private boolean barrelPressed;
+
+ private final QRect barrelRect = new QRect(33, -4, 15, 8);
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ f = 0;
+ timerCount = 0;
+ autoShootTimer = new QTimer(this, "movement handler");
+ connect(autoShootTimer, SIGNAL("timeout()"),
+ this, SLOT("moveShot()"));
+ shoot_ang = 0;
+ shoot_f = 0;
+ target = new QPoint(0, 0);
+ gameEnded = false;
+ barrelPressed = false;
+
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ newTarget();
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public int force() {
+ return f;
+ }
+
+ public void setForce(int newton) {
+ if (newton < 0)
+ newton = 0;
+ if (f == newton)
+ return;
+ f = newton;
+ emit("forceChanged", f);
+ }
+
+ public void shoot() {
+ if (autoShootTimer.isActive())
+ return;
+ timerCount = 0;
+ shoot_ang = ang;
+ shoot_f = f;
+ autoShootTimer.start(50);
+ emit("canShoot", false);
+ }
+
+ public void newTarget() {
+ QRegion r = new QRegion(targetRect());
+ target = new QPoint((int) (200 + Math.random()*190),
+ (int) (10 + Math.random()*255));
+ repaint(r.unite(new QRegion(targetRect())));
+ }
+
+ public void setGameOver() {
+ if (gameEnded)
+ return;
+ if (isShooting())
+ autoShootTimer.stop();
+ gameEnded = true;
+ repaint();
+ }
+
+ public boolean gameOver() {
+ return gameEnded;
+ }
+
+ public void restartGame() {
+ if (isShooting())
+ autoShootTimer.stop();
+ gameEnded = false;
+ repaint();
+ emit("canShoot", true);
+ }
+
+
+ public void moveShot() {
+ QRegion r = new QRegion(shotRect());
+ timerCount++;
+
+ QRect shotR = shotRect();
+
+ if (shotR.intersects(targetRect())) {
+ autoShootTimer.stop();
+ emit("hit");
+ emit("canShoot", true);
+ } else if (shotR.x() > width() || shotR.y() > height() ||
+ shotR.intersects(barrierRect())) {
+ autoShootTimer.stop();
+ emit("missed");
+ emit("canShoot", true);
+ } else {
+ r = r.unite(new QRegion(shotR));
+ }
+
+ repaint(r);
+ }
+
+ protected void mousePressEvent(QMouseEvent e) {
+ if (e.button() != LeftButton)
+ return;
+ if (barrelHit(e.pos()))
+ barrelPressed = true;
+ }
+
+ protected void mouseMoveEvent(QMouseEvent e) {
+ if (!barrelPressed)
+ return;
+ QPoint pnt = e.pos();
+ if (pnt.x() <= 0)
+ pnt.setX(1);
+ if (pnt.y() >= height())
+ pnt.setY(height() - 1);
+ double rad = Math.atan(((double)rect().bottom()-pnt.y())/pnt.x());
+ setAngle((int) (rad*180/3.14159265));
+ }
+
+ protected void mouseReleaseEvent(QMouseEvent e) {
+ if (e.button() == LeftButton)
+ barrelPressed = true;
+ }
+
+
+ protected void paintEvent(QPaintEvent e) {
+ QRect updateR = e.rect();
+ QPainter p = new QPainter(this);
+
+ if (gameEnded) {
+ p.setPen(black());
+ p.setFont(new QFont("Courier", 48, QFont.Bold, false));
+ p.drawText(rect(), AlignCenter, "Game Over");
+ }
+ if (updateR.intersects(cannonRect()))
+ paintCannon(p);
+ if (updateR.intersects(barrierRect()))
+ paintBarrier(p);
+ if (isShooting() && updateR.intersects(shotRect()))
+ paintShot(p);
+ if (!gameEnded && updateR.intersects(targetRect()))
+ paintTarget(p);
+ }
+
+ private void paintShot(QPainter p) {
+ p.setBrush(black());
+ p.setPen(NoPen);
+ p.drawRect(shotRect());
+ }
+
+ private void paintTarget(QPainter p) {
+ p.setBrush(red());
+ p.setPen(black());
+ p.drawRect(targetRect());
+ }
+
+ private void paintBarrier(QPainter p) {
+ p.setBrush(yellow());
+ p.setPen(black());
+ p.drawRect(barrierRect());
+ }
+
+ private void paintCannon(QPainter p) {
+ QRect cr = cannonRect();
+ QPixmap pix = new QPixmap(cr.size());
+ pix.fill(new QColor(250, 250, 200));
+
+ QPainter tmp = new QPainter(pix);
+ tmp.setBrush(blue());
+ tmp.setPen(NoPen);
+
+ tmp.translate(0, pix.height() - 1);
+ tmp.drawPie(new QRect(-35,-35, 70, 70), 0, 90*16);
+ tmp.rotate(-ang);
+ tmp.drawRect(barrelRect);
+ tmp.end();
+
+ p.drawPixmap(cr.topLeft(), pix);
+ }
+
+ private QRect cannonRect() {
+ QRect r = new QRect(0, 0, 50, 50);
+ r.moveBottomLeft(rect().bottomLeft());
+ return r;
+ }
+
+ private QRect shotRect() {
+ final double gravity = 4;
+
+ double time = timerCount / 4.0;
+ double velocity = shoot_f;
+ double radians = shoot_ang*3.14159265/180;
+
+ double velx = velocity*Math.cos(radians);
+ double vely = velocity*Math.sin(radians);
+ double x0 = (barrelRect.right() + 5)*Math.cos(radians);
+ double y0 = (barrelRect.right() + 5)*Math.sin(radians);
+ double x = x0 + velx*time;
+ double y = y0 + vely*time - 0.5*gravity*time*time;
+
+ QRect r = new QRect(0, 0, 6, 6);
+ r.moveCenter(new QPoint((int) x, height() - 1 - (int) y));
+ return r;
+ }
+
+ private QRect targetRect() {
+ QRect r = new QRect(0, 0, 20, 10);
+ r.moveCenter(new QPoint(target.x(),height() - 1 - target.y()));
+ return r;
+ }
+
+ private QRect barrierRect() {
+ return new QRect(145, height() - 100, 15, 100);
+ }
+
+ private boolean barrelHit(QPoint p) {
+ QWMatrix mtx = new QWMatrix();
+ mtx.translate(0, height() - 1);
+ mtx.rotate(-ang);
+ mtx = mtx.invert(new boolean[1]);
+ return barrelRect.contains(mtx.map(p));
+ }
+
+ public boolean isShooting() {
+ return autoShootTimer.isActive();
+ }
+
+ public QSize sizeHint() {
+ return new QSize(400, 300);
+ }
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t14/GameBoard.java b/qtjava/javalib/tutorial/t14/GameBoard.java
new file mode 100644
index 00000000..46efa2eb
--- /dev/null
+++ b/qtjava/javalib/tutorial/t14/GameBoard.java
@@ -0,0 +1,118 @@
+import org.kde.qt.*;
+
+public class GameBoard extends QWidget {
+ private QLCDNumber hits;
+ private QLCDNumber shotsLeft;
+ private CannonField cannonField;
+
+ public GameBoard() {
+ super(null, "gameboard");
+ QPushButton quit = new QPushButton("&Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange("ANGLE", this, "angle");
+ angle.setRange(5, 70);
+
+ LCDRange force = new LCDRange("FORCE", this, "force");
+ force.setRange(10, 50);
+
+ QVBox box = new QVBox(this, "cannonFrame");
+ box.setFrameStyle(QFrame.WinPanel | QFrame.Sunken);
+
+ cannonField = new CannonField(box, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ connect(force, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setForce(int)"));
+ connect(cannonField, SIGNAL("forceChanged(int)"),
+ force, SLOT("setValue(int)"));
+
+ connect(cannonField, SIGNAL("hit()"),
+ this, SLOT("hit()"));
+ connect(cannonField, SIGNAL("missed()"),
+ this, SLOT("missed()"));
+
+ QPushButton shoot = new QPushButton("&Shoot", this, "shoot");
+ shoot.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(shoot, SIGNAL("clicked()"), SLOT("fire()"));
+
+ QPushButton restart = new QPushButton("&New Game", this, "newgame");
+ restart.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(restart, SIGNAL("clicked()"), this, SLOT("newGame()"));
+
+ hits = new QLCDNumber(2, this, "hits");
+ shotsLeft = new QLCDNumber(2, this, "shotsleft");
+ QLabel hitsL = new QLabel("HITS", this, "hitsLabel", 0);
+ QLabel shotsLeftL = new QLabel("SHOTS LEFT", this, "shotsleftLabel", 0);
+
+ QAccel accel = new QAccel(this);
+ accel.connectItem(accel.insertItem(new QKeySequence(Key_Enter)), this, SLOT("fire()"));
+ accel.connectItem(accel.insertItem(new QKeySequence(Key_Return)), this, SLOT("fire()"));
+ accel.connectItem(accel.insertItem(new QKeySequence(CTRL+Key_Q)), qApp(), SLOT("quit()"));
+/***
+ accel.connectItem(accel.insertItem(Key_Enter), this, SLOT("fire()"));
+ accel.connectItem(accel.insertItem(Key_Return), this, SLOT("fire()"));
+ accel.connectItem(accel.insertItem(CTRL+Key_Q), qApp(), SLOT("quit()"));
+***/
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(box, 1, 1);
+ grid.setColStretch(1, 10);
+
+ QVBoxLayout leftBox = new QVBoxLayout();
+ grid.addLayout(leftBox, 1, 0);
+ leftBox.addWidget(angle);
+ leftBox.addWidget(force);
+
+ QHBoxLayout topBox = new QHBoxLayout();
+ grid.addLayout(topBox, 0, 1);
+ topBox.addWidget(shoot);
+ topBox.addWidget(hits);
+ topBox.addWidget(hitsL);
+ topBox.addWidget(shotsLeft);
+ topBox.addWidget(shotsLeftL);
+ topBox.addStretch(1);
+ topBox.addWidget(restart);
+
+ angle.setValue(60);
+ force.setValue(25);
+ angle.setFocus();
+
+ newGame();
+ }
+
+ protected void fire() {
+ if (cannonField.gameOver() || cannonField.isShooting())
+ return;
+ shotsLeft.display(shotsLeft.intValue() - 1);
+ cannonField.shoot();
+ }
+
+ protected void hit() {
+ hits.display(hits.intValue() + 1);
+ if (shotsLeft.intValue() == 0)
+ cannonField.setGameOver();
+ else
+ cannonField.newTarget();
+ }
+
+ protected void missed() {
+ if (shotsLeft.intValue() == 0)
+ cannonField.setGameOver();
+ }
+
+ protected void newGame() {
+ shotsLeft.display(15);
+ hits.display(0);
+ cannonField.restartGame();
+ cannonField.newTarget();
+ }
+}
diff --git a/qtjava/javalib/tutorial/t14/LCDRange.java b/qtjava/javalib/tutorial/t14/LCDRange.java
new file mode 100644
index 00000000..bf5001db
--- /dev/null
+++ b/qtjava/javalib/tutorial/t14/LCDRange.java
@@ -0,0 +1,61 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QWidget {
+ private QSlider slider;
+ private QLabel label;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ init();
+ }
+
+ public LCDRange(String s, QWidget parent, String name) {
+ super(parent, name);
+ init();
+ setText(s);
+ }
+
+ private void init() {
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ label = new QLabel(" ", this, "label", 0);
+ label.setAlignment(AlignCenter);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+
+ QVBoxLayout l = new QVBoxLayout(this);
+ l.addWidget(lcd, 1);
+ l.addWidget(slider);
+ l.addWidget(label);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+
+ public void setText(String s) {
+ label.setText(s);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t14/Tut14.java b/qtjava/javalib/tutorial/t14/Tut14.java
new file mode 100644
index 00000000..ace919c3
--- /dev/null
+++ b/qtjava/javalib/tutorial/t14/Tut14.java
@@ -0,0 +1,24 @@
+import org.kde.qt.*;
+
+public class Tut14 extends QObject {
+ public static void main(String[] args) {
+ QApplication.setColorSpec(QApplication.CustomColor);
+ QApplication a = new QApplication(args);
+
+ GameBoard gb = new GameBoard();
+ gb.setGeometry(100, 100, 500, 355);
+ a.setMainWidget(gb);
+ gb.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t2/Tut2.java b/qtjava/javalib/tutorial/t2/Tut2.java
new file mode 100644
index 00000000..d9e0883a
--- /dev/null
+++ b/qtjava/javalib/tutorial/t2/Tut2.java
@@ -0,0 +1,25 @@
+import org.kde.qt.*;
+
+public class Tut2 extends QObject {
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+ QPushButton quit = new QPushButton("Quit", null);
+ quit.resize( 75, 30 );
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), a, SLOT("quit()"));
+
+ a.setMainWidget(quit);
+ quit.show();
+ a.exec();
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t3/Tut3.java b/qtjava/javalib/tutorial/t3/Tut3.java
new file mode 100644
index 00000000..7a1e0a43
--- /dev/null
+++ b/qtjava/javalib/tutorial/t3/Tut3.java
@@ -0,0 +1,28 @@
+import org.kde.qt.*;
+
+public class Tut3 extends QObject {
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+
+ QVBox box = new QVBox();
+ box.resize(200, 120);
+
+ QPushButton quit = new QPushButton("Quit", box);
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), a, SLOT("quit()"));
+
+ a.setMainWidget(box);
+ box.show();
+ a.exec();
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t4/Tut4.java b/qtjava/javalib/tutorial/t4/Tut4.java
new file mode 100644
index 00000000..dd67e272
--- /dev/null
+++ b/qtjava/javalib/tutorial/t4/Tut4.java
@@ -0,0 +1,33 @@
+import org.kde.qt.*;
+
+public class Tut4 extends QWidget {
+ public Tut4() {
+ setMinimumSize(200,120);
+ setMaximumSize(200,120);
+
+ QPushButton quit = new QPushButton("Quit", this, "quit");
+ quit.setGeometry(62, 40, 75, 30);
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+ }
+
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+
+ Tut4 w = new Tut4();
+ w.setGeometry(100, 100, 200, 120);
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t5/Tut5.java b/qtjava/javalib/tutorial/t5/Tut5.java
new file mode 100644
index 00000000..e0de9ac5
--- /dev/null
+++ b/qtjava/javalib/tutorial/t5/Tut5.java
@@ -0,0 +1,37 @@
+import org.kde.qt.*;
+
+public class Tut5 extends QVBox {
+ public Tut5() {
+ QPushButton quit = new QPushButton("Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+
+ QSlider slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ connect(slider, SIGNAL("valueChanged(int)"), lcd, SLOT("display(int)"));
+ }
+
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+
+ Tut5 w = new Tut5();
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t6/LCDRange.java b/qtjava/javalib/tutorial/t6/LCDRange.java
new file mode 100644
index 00000000..9db207c8
--- /dev/null
+++ b/qtjava/javalib/tutorial/t6/LCDRange.java
@@ -0,0 +1,15 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ QSlider slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+ connect(slider, SIGNAL("valueChanged(int)"), lcd, SLOT("display(int)"));
+ }
+ public LCDRange(QWidget parent) {
+ this(parent, null);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t6/Tut6.java b/qtjava/javalib/tutorial/t6/Tut6.java
new file mode 100644
index 00000000..8da2e736
--- /dev/null
+++ b/qtjava/javalib/tutorial/t6/Tut6.java
@@ -0,0 +1,35 @@
+import org.kde.qt.*;
+
+public class Tut6 extends QVBox {
+ public Tut6() {
+ QPushButton quit = new QPushButton("Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ QGrid grid = new QGrid(4, this, null, 0);
+
+ for(int c = 0; c < 4; c++)
+ for(int r = 0; r < 4; r++)
+ new LCDRange(grid);
+ }
+
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+ Tut6 w = new Tut6();
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t7/LCDRange.java b/qtjava/javalib/tutorial/t7/LCDRange.java
new file mode 100644
index 00000000..9208ae85
--- /dev/null
+++ b/qtjava/javalib/tutorial/t7/LCDRange.java
@@ -0,0 +1,29 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ private QSlider slider;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+ }
+ public LCDRange(QWidget parent) {
+ this(parent, null);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t7/Tut7.java b/qtjava/javalib/tutorial/t7/Tut7.java
new file mode 100644
index 00000000..bed0243c
--- /dev/null
+++ b/qtjava/javalib/tutorial/t7/Tut7.java
@@ -0,0 +1,42 @@
+import org.kde.qt.*;
+
+public class Tut7 extends QVBox {
+ public Tut7() {
+ QPushButton quit = new QPushButton("Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ QGrid grid = new QGrid(4, this, null, 0);
+
+ LCDRange previous = null;
+ for(int r = 0; r < 4; r++) {
+ for(int c = 0; c < 4; c++) {
+ LCDRange lr = new LCDRange(grid);
+ if (previous!=null)
+ connect(lr, SIGNAL("valueChanged(int)"),
+ previous, SLOT("setValue(int)"));
+ previous = lr;
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+ Tut7 w = new Tut7();
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t8/CannonField.java b/qtjava/javalib/tutorial/t8/CannonField.java
new file mode 100644
index 00000000..e9b77ccb
--- /dev/null
+++ b/qtjava/javalib/tutorial/t8/CannonField.java
@@ -0,0 +1,37 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public void paintEvent(QPaintEvent e) {
+ String s = "Angle = " + ang;
+ QPainter p = new QPainter(this);
+ p.drawText(200, 200, s);
+ }
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t8/LCDRange.java b/qtjava/javalib/tutorial/t8/LCDRange.java
new file mode 100644
index 00000000..7bbb9886
--- /dev/null
+++ b/qtjava/javalib/tutorial/t8/LCDRange.java
@@ -0,0 +1,38 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ private QSlider slider;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t8/Tut8.java b/qtjava/javalib/tutorial/t8/Tut8.java
new file mode 100644
index 00000000..f0d31c1f
--- /dev/null
+++ b/qtjava/javalib/tutorial/t8/Tut8.java
@@ -0,0 +1,51 @@
+import org.kde.qt.*;
+
+public class Tut8 extends QWidget {
+ public Tut8() {
+ QPushButton quit = new QPushButton("Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange(this, "angle");
+ angle.setRange(5, 70);
+
+ CannonField cannonField = new CannonField(this, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ //2x2, 10 pixel border
+
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(angle, 1, 0, Qt.AlignTop);
+ grid.addWidget(cannonField, 1, 1);
+ grid.setColStretch(1, 10);
+
+ angle.setValue(60);
+ angle.setFocus();
+ }
+
+ public static void main(String[] args) {
+ QApplication a = new QApplication(args);
+ Tut8 w = new Tut8();
+ w.setGeometry( 100, 100, 500, 355 );
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}
diff --git a/qtjava/javalib/tutorial/t9/CannonField.java b/qtjava/javalib/tutorial/t9/CannonField.java
new file mode 100644
index 00000000..e8bc506f
--- /dev/null
+++ b/qtjava/javalib/tutorial/t9/CannonField.java
@@ -0,0 +1,43 @@
+import org.kde.qt.*;
+
+public class CannonField extends QWidget {
+ private int ang;
+
+ public CannonField(QWidget parent, String name) {
+ super(parent, name);
+ ang = 45;
+ setPalette(new QPalette(new QColor(250, 250, 200)));
+ }
+
+ public int angle() {
+ return ang;
+ }
+
+ public void setAngle(int degrees) {
+ if (degrees < 5)
+ degrees = 5;
+ if (degrees > 70)
+ degrees = 70;
+ if (ang == degrees)
+ return;
+ ang = degrees;
+ repaint();
+ emit("angleChanged", ang);
+ }
+
+ public void paintEvent(QPaintEvent e) {
+ QPainter p = new QPainter(this);
+
+ p.setBrush(blue());
+ p.setPen(NoPen);
+
+ p.translate(0, rect().bottom());
+ p.drawPie(new QRect(-35, -35, 70, 70), 0, 90*16);
+ p.rotate(-ang);
+ p.drawRect(new QRect(33, -4, 15, 8));
+ }
+
+ public QSizePolicy sizePolicy() {
+ return new QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t9/LCDRange.java b/qtjava/javalib/tutorial/t9/LCDRange.java
new file mode 100644
index 00000000..7bbb9886
--- /dev/null
+++ b/qtjava/javalib/tutorial/t9/LCDRange.java
@@ -0,0 +1,38 @@
+import org.kde.qt.*;
+
+public class LCDRange extends QVBox {
+ private QSlider slider;
+
+ public LCDRange(QWidget parent, String name) {
+ super(parent, name);
+ QLCDNumber lcd = new QLCDNumber(2, this, "lcd");
+ slider = new QSlider(Horizontal, this, "slider");
+ slider.setRange(0, 99);
+ slider.setValue(0);
+
+ connect(slider, SIGNAL("valueChanged(int)"),
+ lcd, SLOT("display(int)"));
+ connect(slider, SIGNAL("valueChanged(int)"),
+ SIGNAL("valueChanged(int)"));
+
+ setFocusProxy(slider);
+ }
+
+ public int value() {
+ return slider.value();
+ }
+
+ public void setValue(int value) {
+ slider.setValue(value);
+ }
+
+ public void setRange(int minVal, int maxVal) {
+ if (minVal < 0 || maxVal > 99 || minVal > maxVal) {
+ qWarning("LCDRange::setRange("+minVal+","+maxVal+")\n"+
+ "\tRange must be 0..99\n"+
+ "\tand minVal must not be greater than maxVal");
+ return;
+ }
+ slider.setRange(minVal, maxVal);
+ }
+}
diff --git a/qtjava/javalib/tutorial/t9/Tut9.java b/qtjava/javalib/tutorial/t9/Tut9.java
new file mode 100644
index 00000000..f936c37a
--- /dev/null
+++ b/qtjava/javalib/tutorial/t9/Tut9.java
@@ -0,0 +1,52 @@
+import org.kde.qt.*;
+
+public class Tut9 extends QWidget {
+ public Tut9() {
+ QPushButton quit = new QPushButton("Quit", this, "quit");
+ quit.setFont(new QFont("Times", 18, QFont.Bold, false));
+
+ connect(quit, SIGNAL("clicked()"), qApp(), SLOT("quit()"));
+
+ LCDRange angle = new LCDRange(this, "angle");
+ angle.setRange(5, 70);
+
+ CannonField cannonField = new CannonField(this, "cannonField");
+
+ connect(angle, SIGNAL("valueChanged(int)"),
+ cannonField, SLOT("setAngle(int)"));
+ connect(cannonField, SIGNAL("angleChanged(int)"),
+ angle, SLOT("setValue(int)"));
+
+ QGridLayout grid = new QGridLayout(this, 2, 2, 10, -1, null);
+ //2x2, 10 pixel border
+
+ grid.addWidget(quit, 0, 0);
+ grid.addWidget(angle, 1, 0, Qt.AlignTop);
+ grid.addWidget(cannonField, 1, 1);
+ grid.setColStretch(1, 10);
+
+ angle.setValue(60);
+ angle.setFocus();
+ }
+
+ public static void main(String[] args) {
+ QApplication.setColorSpec(QApplication.CustomColor);
+ QApplication a = new QApplication(args);
+ Tut9 w = new Tut9();
+ w.setGeometry( 100, 100, 500, 355 );
+
+ a.setMainWidget(w);
+ w.show();
+ a.exec();
+ return;
+ }
+
+ static {
+ try {
+ Class c = Class.forName("org.kde.qt.qtjava");
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Can't load qtjava class");
+ }
+ }
+}