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 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.


www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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/):

 

www.informatika-programozas.hu - Hatványozós applikáció