Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Üveghangkereső
Nyilvánvalóan nem várhatom el, hogy a Java-programozást tanuló tanítvány
egyúttal zeneileg is képzett legyen, ezért most nem fogom megmagyarázni az
alábbi minialkalmazás funkcionalitását. A téma iránt érdeklődő a kapcsolódó
zeneelméletet elolvashatja az alábbi fejezetekben:
Itt legyen annyi elég, hogy a
program adott hangszerhúrhosszból kiszámolja a húron lecsapódó úgynevezett
„természetes felharmonikus hangok” (másnéven üveghangok - flageolet)
konkrét pozícióit. A program alapfunkciója tehát nem bonyolult, bár a teljes
körű validálás és a baloldali menü már kissé azzá teszi.
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 java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;
import javax.swing.*;
class Window extends JFrame implements ActionListener{
JFrame frame = new JFrame();
JButton buttonCount = new JButton("Count!");
JButton buttonClear = new JButton("Clear!");
JMenuItem close, about, visit, help;
JLabel labelTitle = new JLabel();
JLabel label_1_1 = new JLabel();
JLabel label_1_2 = new JLabel();
JLabel label_1_3 = new JLabel();
JLabel label_1_4 = new JLabel();
JLabel label_1_5 = new JLabel();
JLabel label_1_6 = new JLabel();
JLabel label_1_7 = new JLabel();
JLabel label_1_8 = new JLabel();
JLabel label_1_9 = new JLabel();
JLabel label_1_10 = new JLabel();
JLabel label_1_11 = new JLabel();
JLabel label_1_12 = new JLabel();
JLabel label_1_13 = new JLabel();
JLabel label_1_14 = new JLabel();
JLabel label_1_15 = new JLabel();
JLabel label_1_16 = new JLabel();
JTextField textFieldLength = new JTextField();
JTextField textField_1_1 = new JTextField();
JTextField textField_1_2 = new JTextField();
JTextField textField_1_3 = new JTextField();
JTextField textField_1_4 = new JTextField();
JTextField textField_1_5 = new JTextField();
JTextField textField_1_6 = new JTextField();
JTextField textField_1_7 = new JTextField();
JTextField textField_1_8 = new JTextField();
JTextField textField_1_9 = new JTextField();
JTextField textField_1_10 = new JTextField();
JTextField textField_1_11 = new JTextField();
JTextField textField_1_12 = new JTextField();
JTextField textField_1_13 = new JTextField();
JTextField textField_1_14 = new JTextField();
JTextField textField_1_15 = new JTextField();
JTextField textField_1_16 = new JTextField();
Window() {
super();
initializationLabels();
initializationTextFields();
JMenu menu;
JMenuBar menuBar = new JMenuBar();
menu = new JMenu("Menu");
menuBar.add(menu);
visit = new JMenuItem("Visit my website!");
about = new JMenuItem("About");
close = new JMenuItem("Close");
help = new JMenuItem("Help");
menu.add(visit);
menu.add(help);
menu.add(about);
menu.add(close);
frame.setJMenuBar(menuBar);
visit.addActionListener(this);
about.addActionListener(this);
close.addActionListener(this);
help.addActionListener(this);
buttonCount.setBounds(100, 87, 200, 25);
buttonCount.addActionListener(event -> buttonActionCount());
buttonClear.setBounds(100, 120, 200, 25);
buttonClear.addActionListener(event -> buttonActionClear());
ImageIcon ikon = new ImageIcon("ikon.jpg");
frame.setIconImage(ikon.getImage());
frame.add(buttonCount);
frame.add(buttonClear);
frame.add(labelTitle);
frame.add(label_1_1);
frame.add(label_1_2);
frame.add(label_1_3);
frame.add(label_1_4);
frame.add(label_1_5);
frame.add(label_1_6);
frame.add(label_1_7);
frame.add(label_1_8);
frame.add(label_1_9);
frame.add(label_1_10);
frame.add(label_1_11);
frame.add(label_1_12);
frame.add(label_1_13);
frame.add(label_1_14);
frame.add(label_1_15);
frame.add(label_1_16);
frame.add(textFieldLength);
frame.add(textField_1_1);
frame.add(textField_1_2);
frame.add(textField_1_3);
frame.add(textField_1_4);
frame.add(textField_1_5);
frame.add(textField_1_6);
frame.add(textField_1_7);
frame.add(textField_1_8);
frame.add(textField_1_9);
frame.add(textField_1_10);
frame.add(textField_1_11);
frame.add(textField_1_12);
frame.add(textField_1_13);
frame.add(textField_1_14);
frame.add(textField_1_15);
frame.add(textField_1_16);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(420, 650);
frame.setTitle("PJP - Penzes Java Programming");
Center center = new Center();
center.setCenter(frame);
frame.setLayout(null);
frame.setVisible(true);
}
private void buttonActionCount() {
double menzura = 0;
if(textFieldLength.getText().equals ("")) {
JOptionPane.showMessageDialog(frame,
"Empty textfield!");
buttonActionClear();
return;
}
try {
menzura =
Double.parseDouble(textFieldLength.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(frame,
"The text is not a number or bad typing!"
+ "\nAn
example for correct typing: 863.2");
buttonActionClear();
return;
}
if(menzura < 100 || menzura > 1500) {
JOptionPane.showMessageDialog(frame,
"No instrument with this string length!");
buttonActionClear();
return;
}
textField_1_1.setText(Double.toString(menzura));
textField_1_2.setText(Double.toString(menzura / 2));
textField_1_3.setText(Double.toString(menzura / 3));
textField_1_4.setText(Double.toString(menzura / 4));
textField_1_5.setText(Double.toString(menzura / 5));
textField_1_6.setText(Double.toString(menzura / 6));
textField_1_7.setText(Double.toString(menzura / 7));
textField_1_8.setText(Double.toString(menzura / 8));
textField_1_9.setText(Double.toString(menzura / 9));
textField_1_10.setText(Double.toString(menzura / 10));
textField_1_11.setText(Double.toString(menzura / 11));
textField_1_12.setText(Double.toString(menzura / 12));
textField_1_13.setText(Double.toString(menzura / 13));
textField_1_14.setText(Double.toString(menzura / 14));
textField_1_15.setText(Double.toString(menzura / 15));
textField_1_16.setText(Double.toString(menzura / 16));
}
private void buttonActionClear() {
textFieldLength.setText("0");
textField_1_1.setText("0");
textField_1_2.setText("0");
textField_1_3.setText("0");
textField_1_4.setText("0");
textField_1_5.setText("0");
textField_1_6.setText("0");
textField_1_7.setText("0");
textField_1_8.setText("0");
textField_1_9.setText("0");
textField_1_10.setText("0");
textField_1_11.setText("0");
textField_1_12.setText("0");
textField_1_13.setText("0");
textField_1_14.setText("0");
textField_1_15.setText("0");
textField_1_16.setText("0");
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == visit) {
try {
Desktop.getDesktop().browse(new URI("http://www.informatika-programozas.hu"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame,
"Connection was not successful!");
}
}
if(e.getSource() == help) {
JOptionPane.showMessageDialog(frame,
"It is NOT allowed:\n"
+ "1. string length < 100 mm or > 1500 mm\n"
+ "2. empty string length textfield\n"
+ "3. NOT integer or floating point number (e.g.: any letter,
symbol, etc.)\n"
+ "4. in case of floating point number: 3,5\n"
+ "\n"
+ "You should type a floating point number like this: 3.5");
}
if(e.getSource() == about) {
JOptionPane.showMessageDialog(frame,
"Copyright PJP-Pénzes László - 2015-2022. All rights
reserved.\n"
+ "This free software is only for educational purpose.\n"
+ "NOT allowed to redistribute, sale or change the statement
of copyrights.\n"
+ "If you need any additional help, plesase send me an e-mail
here:\n"
+ "info@informatika-programozas.hu");
}
if(e.getSource() == close) {
System.exit(0);
}
}
private void initializationLabels() {
labelTitle.setBounds(137, 15, 200, 25);
labelTitle.setFont(new Font("Serif", Font.PLAIN, 15));
labelTitle.setText("String length (in mm)");
label_1_1.setBounds(80, 152, 50, 25);
label_1_1.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_1.setText("1/1");
label_1_2.setBounds(80, 177, 50, 25); //25
label_1_2.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_2.setText("1/2");
label_1_3.setBounds(80, 202, 50, 25);
label_1_3.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_3.setText("1/3");
label_1_4.setBounds(80, 227, 50, 25);
label_1_4.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_4.setText("1/4");
label_1_5.setBounds(80, 252, 50, 25);
label_1_5.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_5.setText("1/5");
label_1_6.setBounds(80, 277, 50, 25);
label_1_6.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_6.setText("1/6");
label_1_7.setBounds(80, 302, 50, 25);
label_1_7.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_7.setText("1/7");
label_1_8.setBounds(80, 327, 50, 25);
label_1_8.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_8.setText("1/8");
label_1_9.setBounds(80, 352, 50, 25);
label_1_9.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_9.setText("1/9");
label_1_10.setBounds(73, 377, 50, 25);
label_1_10.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_10.setText("1/10");
label_1_11.setBounds(73, 402, 50, 25);
label_1_11.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_11.setText("1/11");
label_1_12.setBounds(73, 427, 50, 25);
label_1_12.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_12.setText("1/12");
label_1_13.setBounds(73, 452, 50, 25);
label_1_13.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_13.setText("1/13");
label_1_14.setBounds(73, 477, 50, 25);
label_1_14.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_14.setText("1/14");
label_1_15.setBounds(73, 502, 50, 25);
label_1_15.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_15.setText("1/15");
label_1_16.setBounds(73, 527, 50, 25);
label_1_16.setFont(new Font("Serif", Font.PLAIN, 15));
label_1_16.setText("1/16");
}
private void initializationTextFields() {
textFieldLength.setBounds(100, 40, 200, 40);
textFieldLength.setFont(new Font("Serif", Font.PLAIN, 20));
textFieldLength.setHorizontalAlignment(JTextField.CENTER);
textFieldLength.setText("0");
textField_1_1.setBounds(100, 155, 200, 20);
textField_1_1.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_1.setHorizontalAlignment(JTextField.CENTER);
textField_1_2.setBounds(100, 180, 200, 20); //25
textField_1_2.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_2.setHorizontalAlignment(JTextField.CENTER);
textField_1_3.setBounds(100, 205, 200, 20);
textField_1_3.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_3.setHorizontalAlignment(JTextField.CENTER);
textField_1_4.setBounds(100, 230, 200, 20);
textField_1_4.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_4.setHorizontalAlignment(JTextField.CENTER);
textField_1_5.setBounds(100, 255, 200, 20);
textField_1_5.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_5.setHorizontalAlignment(JTextField.CENTER);
textField_1_6.setBounds(100, 280, 200, 20);
textField_1_6.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_6.setHorizontalAlignment(JTextField.CENTER);
textField_1_7.setBounds(100, 305, 200, 20);
textField_1_7.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_7.setHorizontalAlignment(JTextField.CENTER);
textField_1_8.setBounds(100, 330, 200, 20);
textField_1_8.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_8.setHorizontalAlignment(JTextField.CENTER);
textField_1_9.setBounds(100, 355, 200, 20);
textField_1_9.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_9.setHorizontalAlignment(JTextField.CENTER);
textField_1_10.setBounds(100, 380, 200, 20);
textField_1_10.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_10.setHorizontalAlignment(JTextField.CENTER);
textField_1_11.setBounds(100, 405, 200, 20);
textField_1_11.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_11.setHorizontalAlignment(JTextField.CENTER);
textField_1_12.setBounds(100, 430, 200, 20);
textField_1_12.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_12.setHorizontalAlignment(JTextField.CENTER);
textField_1_13.setBounds(100, 455, 200, 20);
textField_1_13.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_13.setHorizontalAlignment(JTextField.CENTER);
textField_1_14.setBounds(100, 480, 200, 20);
textField_1_14.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_14.setHorizontalAlignment(JTextField.CENTER);
textField_1_15.setBounds(100, 505, 200, 20);
textField_1_15.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_15.setHorizontalAlignment(JTextField.CENTER);
textField_1_16.setBounds(100, 530, 200, 20);
textField_1_16.setFont(new Font("Serif", Font.PLAIN, 15));
textField_1_16.setHorizontalAlignment(JTextField.CENTER);
buttonActionClear();
}
}
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: