import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public interface Interact { public static final JFrame FRAME = new JFrame(); public static final JTextField FIELD = new JTextField(); public static final JPanel PANEL = new JPanel(); public static void setDefaultCloseOperation(JFrame frame) { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void setText(JTextField field) { field.setText("0"); } public static void setEditable(JTextField field) { field.setEditable(false); } public static boolean isDigitKeyChar(KeyEvent event) { return !Character.isDigit(event.getKeyChar()); } public static void keyTyped(KeyEvent event) { Stream.of(event) .parallel() .filter(Interact::isDigitKeyChar) .forEach(KeyEvent::consume) ; } public static void addKeyListener(JTextField field) { field.addKeyListener((FunctionalKeyListener.Typed) Interact::keyTyped); } public static String mapText(String text) { return text.isEmpty() ? "1" : String.valueOf(Long.valueOf(text) + 1) ; } public static void actionPerformedOnIncrementButton(ActionEvent event) { Stream.of(FIELD) .parallel() .map(JTextField::getText) .map(Interact::mapText) .forEach(FIELD::setText) ; } public static void addActionListenerToIncrementButton(JButton button) { button.addActionListener(Interact::actionPerformedOnIncrementButton); } public static void addIncrementButton(JPanel panel) { Stream.of("Increment") .parallel() .map(JButton::new) .peek(Interact::addActionListenerToIncrementButton) .forEach(panel::add) ; } public static int showConfirmDialog(String question) { return JOptionPane.showConfirmDialog(null, question); } public static void setFieldText(int integer) { FIELD.setText( String.valueOf( (long) (Math.random() * Long.MAX_VALUE)) ) ; } public static void actionPerformedOnRandomButton(ActionEvent event) { Stream.of("Are you sure?") .parallel() .map(Interact::showConfirmDialog) .filter(Predicate.isEqual(JOptionPane.YES_OPTION)) .forEach(Interact::setFieldText) ; } public static void addActionListenerToRandomButton(JButton button) { button.addActionListener(Interact::actionPerformedOnRandomButton); } public static void addRandomButton(JPanel panel) { Stream.of("Random") .parallel() .map(JButton::new) .peek(Interact::addActionListenerToRandomButton) .forEach(panel::add) ; } public static void acceptField(Consumer consumer) { consumer.accept(FIELD); } public static void prepareField(JTextField field) { Stream.>of( Interact::setEditable, Interact::setText, Interact::addKeyListener ) .parallel() .forEach(Interact::acceptField) ; } public static void addField(JFrame frame) { Stream.of(FIELD) .parallel() .peek(Interact::prepareField) .forEach(frame::add) ; } public static void acceptPanel(Consumer consumer) { consumer.accept(PANEL); } public static void processPanel(JPanel panel) { Stream.>of( Interact::setLayout, Interact::addIncrementButton, Interact::addRandomButton ) .parallel() .forEach(Interact::acceptPanel) ; } public static void addPanel(JFrame frame) { Stream.of(PANEL) .parallel() .peek(Interact::processPanel) .forEach(frame::add) ; } public static void setLayout(JFrame frame) { frame.setLayout(new GridLayout(2, 1)); } public static void setLayout(JPanel panel) { panel.setLayout(new GridLayout(1, 2)); } public static void setVisible(JFrame frame) { frame.setVisible(true); } public static void acceptFrame(Consumer consumer) { consumer.accept(FRAME); } public static void processField(JFrame frame) { Stream.>of( Interact::setDefaultCloseOperation, Interact::setLayout, Interact::addField, Interact::addPanel, Interact::setVisible ) .parallel() .forEach(Interact::acceptFrame) ; } public static void main(String... arguments) { Stream.of(FRAME) .parallel() .peek(Interact::processField) .forEach(JFrame::pack) ; } }