Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Hatványozós applikáció
Az egyik előző fejezetben (A
textfield alaptulajdonságai) a szövegmező 2 fő metódusát teszteltük
le. Ebben a projektben alkossunk egy olyan Java-alkalmazást, amelyik 3
szövegmező és 2 gomb segítségével képes kiszámolni x szám (base)
y hatványát (exponent)! Például 67 = 279936.
Ráadásként végezzünk el teljes validálást, azaz a felhasználó semmilyen módon
ne tudja a programot szétgonoszkodni!
Amint látni fogjuk, általában a teljes validálás követelményének lekezelése
vesz el a legtöbbet a tervezési és programozási időnkből. Érdemes a validálási
szempontokat pontosan és előzetesen felvázolnunk. Le kell kezelnünk, ha:
-
a felhasználó túl nagy összegű műveletet kíván elvégezni, például: 200200 → üzenetablak,
-
a felhasználó bárhová rossz bemeneti adatot ír be, például: h → üzenetablak,
-
ha az eredménymezőbe ír, azaz tényleg teljesen lökött vagy hackerkedik, akkor az nincs semmiféle hatással a programra, valamint a jó eredmény úgyis felül fogja írni.
A konkrét számítás elvégzéséhez
írhatunk saját rutint (Hatványozódjunk...
című fejezet), de érdemes inkább a beépített
Math.power() függvényt felhasználnunk, mert sok további, kényelmi és
validáló szolgáltatással is rendelkezik, ilyen például, hogy gond nélkül képes
negatív számú hatványt számolni vagy annak lekezelése, hogy x0
mindig 1. (Figyelem: 00 = 1!)
Érdemes majd észrevennünk a kódban a következőt:
textFieldResult.setHorizontalAlignment(JTextField.CENTER);
Ez a függvény az eredménymezőben megjelenítendő szöveget középre zárja.
Utolsó megjegyzés, hogyha a
frame méretét nem kaotikusan, hanem valamilyen
belső matematikai arányosság alapján választjuk meg (ebből a felhasználó
semmit sem érzékel), akkor a komponensek pontos, akár pixelszintű
pozícionálása jóval könnyebb lesz.
Nézzük meg a futtatható Java-kódot:
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import java.awt.*;
import javax.swing.*;
class Window extends JFrame {
JFrame frame = new JFrame();
JButton buttonOK = new JButton("Count it!");
JButton buttonClear = new JButton("Clear!");
JLabel labelTitle = new JLabel();
JLabel labelBase = new JLabel();
JLabel labelExponent = new JLabel();
JTextField textFieldBase = new JTextField();
JTextField textFieldExponent = new JTextField();
JTextField textFieldResult = new JTextField();
Window() {
super();
labelTitle.setBounds(105, 25, 200, 25);
labelTitle.setFont(new Font("Serif", Font.PLAIN, 18));
labelTitle.setText("App for raising to a power");
labelBase.setBounds(100, 75, 75, 25);
labelBase.setFont(new Font("Serif", Font.PLAIN, 18));
labelBase.setText("Base");
labelExponent.setBounds(100, 100, 75, 25);
labelExponent.setFont(new Font("Serif", Font.PLAIN, 18));
labelExponent.setText("Exponent");
textFieldBase.setBounds(175, 75, 125, 25);
textFieldExponent.setBounds(175, 100, 125, 25);
textFieldResult.setBounds(100, 150, 200, 25);
textFieldResult.setHorizontalAlignment(JTextField.CENTER);
buttonOK.setBounds(100, 175, 200, 25);
buttonOK.addActionListener(event -> buttonActionOK());
buttonClear.setBounds(100, 200, 200, 25);
buttonClear.addActionListener(event -> buttonActionClear());
frame.add(buttonOK);
frame.add(buttonClear);
frame.add(labelTitle);
frame.add(labelBase);
frame.add(labelExponent);
frame.add(textFieldBase);
frame.add(textFieldExponent);
frame.add(textFieldResult);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(420, 325);
frame.setTitle("PJP - Penzes Java Programming");
Center center = new Center();
center.setCenter(frame);
frame.setLayout(null);
frame.setVisible(true);
}
private void buttonActionOK() {
double base = 0;
double exponent = 0;
if(textFieldBase.getText().equals ("") ||
textFieldExponent.getText().equals("")) {
JOptionPane.showMessageDialog(frame,
"Empty textfields!");
textFieldBase.setText("");
textFieldExponent.setText("");
return;
}
try {
base =
Double.parseDouble(textFieldBase.getText());
exponent =
Double.parseDouble(textFieldExponent.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(frame,
"The text is not a number!");
textFieldBase.setText("");
textFieldExponent.setText("");
textFieldResult.setText("");
return;
}
double result = Math.pow(base, exponent);
if(result < Double.MIN_VALUE || result > Double.MAX_VALUE) {
JOptionPane.showMessageDialog(frame,
"Too low or too high result!");
textFieldBase.setText("");
textFieldExponent.setText("");
textFieldResult.setText("");
return;
}
textFieldResult.setText(Double.toString(result));
}
private void buttonActionClear() {
textFieldBase.setText("");
textFieldExponent.setText("");
textFieldResult.setText("");
}
}
Center.java
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import javax.swing.JFrame;
public class Center {
void setCenter(JFrame frame) {
Point center =
GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
int x = (int) center.getX() - (frame.getWidth() / 2);
int y = (int) center.getY() - (frame.getHeight() / 2);
Point ablakCenter = new Point(x, y);
frame.setLocation(ablakCenter);
}
}
Végeredmény (a monitor közepén / felbontástól függetlenül/):