Author: Muhammed Afsal Villan

  • How to open file explorer in java

    How to open file explorer in java

    Sometimes, we come across requirements where we need to open a particular folder or directory in the native file explorer. In this tutorial, we will see how to do that, easy and effective.

    Opening file explorer with java in any platform – Windows, Linux and Mac

    The easiest way to do this is by using Java Desktop. The class provides an open() function Desktop#open(File) to open explorer when the given file is a directory.

    private static void openDirectory() throws IOException {
      File directory = new File("C://Program Files//");
      Desktop.getDesktop().open(directory);
    }
    

    Open file explorer and select/highlight a file

    Now, if you want to open the file explorer and have a file preselected, then there is a way for that as well! You can make use of Desktop.fileBrowseDirectory(File) to launch the file explorer and have a file highlighted. Let’s see a code example for the same.

    However, before using this function, you have to keep the following things in mind.

    • The code will not work on ALL platforms.
    • You need to check whether the feature is supported via Desktop.getDesktop().isSupported(Action.BROWSE_FILE_DIR) function.
    • Minimum Java 9 is required
    import java.awt.Desktop;
    import java.awt.Desktop.Action;
    import java.io.File;
    
    public class JavaFileExplorer {
    
      public static void main(String[] args) {
        openDirectory();
      }
    
      private static void openDirectory() {
        //Check if the feature supported on your platform
        if (Desktop.getDesktop().isSupported(Action.BROWSE_FILE_DIR)) {
          File directory = new File("/home/afsal/Downloads/jdk-8u212-linux-x64.tar.gz");
          //Open directory with browse_file_dir option
          Desktop.getDesktop().browseFileDirectory(directory);
        }
      }
    }
    

    Open file explorer in Linux

    Now, if you would like to add specific code for Linux/Ubuntu to open the file explorer, have a look into the following code snippet. We can make use of the xdg-open command to open any directory. The good thing about using this method is that, it works across multiple Linux distributions. They just have to have the xdg-open support.

    private static void openDirectoryInLinux() throws Exception {
      Runtime.getRuntime().exec(
         new String[]{"sh", "-c", "/usr/bin/xdg-open '/home/genuinecoder/Downloads/'"}
       );
    }
    

    Open file explorer in Windows

    Now, if you would like to add specific code for Windows OS to open the file explorer, have a look into the following code snippet. We will execute a cmd command to open Windows explorer.exe.

    private static void openDirectoryInWindows() throws Exception {
      Runtime.getRuntime().exec("explorer C:\\");
    }
    

    Open file explorer in MacOS

    If you are looking for specific code for macOS, you can make use of the /usr/bin/open function to open the directory on macOS.

    private static void openDirectoryInMac() throws Exception {
       Runtime.getRuntime().exec(new String[]{"/usr/bin/open", file.getAbsolutePath()});
    }
    

    Conclusion

    In this tutorial, we have learned how to open a directory from a java program. We have numerous methods to achieve the same goal here. We can use java.awt.Desktop for platform independent support and if platform-specific implementation is required, that is also available. You might also be interested in the following topics.

    1. Java TrayIcon Tutorial
    2. Directory / Folder Indexing Program Using Java
  • JavaFx DatePicker Tutorial

    JavaFx DatePicker Tutorial

    In this tutorial, we will talk about JavaFX DatePicker basic usage, how to format the selected date using DateTimeFormatter to string value, and customize the component using JavaFX CSS.

    Using JavaFx DatePicker

    DatePicker is a standard component in the JavaFX SDK. It can be added from the SceneBuilder via FXML file as well. In the following code snippet, we will add the DatePicker to a simple scene without using FXML.

    import java.time.LocalDate;
    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.scene.Scene;
    import javafx.scene.control.DatePicker;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    public class JavaFXDatePickerTutorial extends Application {
    
      @Override
      public void start(Stage stage) {
        Scene scene = new Scene(new StackPane(createDatePicker()), 400, 500);
        stage.setTitle("JavaFX DatePicker Tutorial");
        stage.setScene(scene);
        stage.show();
      }
    
      //Create a date picker and attach and event listener.
      private DatePicker createDatePicker() {
        DatePicker datePicker = new DatePicker();
        //Set Current date to today's date
        datePicker.setValue(LocalDate.now());
        //Add an event listener for date selection change
        datePicker.valueProperty().addListener(new ChangeListener<LocalDate>() {
          @Override
          public void changed(ObservableValue<? extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
            //Print date change to console
            System.out.println("New date selected: " + newValue);
          }
        });
        return datePicker;
      }
    
      public static void main(String[] args) {
        launch();
      }
    }
    

    JavaFX DatePicker

    Get date as string from JavaFX DatePicker

    We can get the currently selected date anytime from the DatePicker calendar using the datePicker.getValue() function. It will return a LocalDate object representing the currently selected date.

    When we need to display these dates somewhere, we need to convert the object to a formatted string. It can be easily done through Java DateTimeFormatter.

    As an example, let’s convert the selected date to dd/MM/yyyy format.

    private String getFormattedDateFromDatePicker(DatePicker datePicker) {
      //Get the selected date
      LocalDate selectedDate = datePicker.getValue();
      //Create DateTimeFormatter
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
      //Convert LocalDate to formatted String
      return selectedDate.format(formatter);
    }
    

    If you want the date to be formatted in some other way, DateTimeFormatter can be customized. You can prepare your own pattern using the DateTimeFormatter.ofPattern() function. Following section shows some supported symbols you can use to prepare your own date format.

      Symbol  Meaning                     Presentation      Examples
      ------  -------                     ------------      -------
       G       era                         text              AD; Anno Domini; A
       u       year                        year              2004; 04
       y       year-of-era                 year              2004; 04
       D       day-of-year                 number            189
       M/L     month-of-year               number/text       7; 07; Jul; July; J
       d       day-of-month                number            10
    
       Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
       Y       week-based-year             year              1996; 96
       w       week-of-week-based-year     number            27
       W       week-of-month               number            4
       E       day-of-week                 text              Tue; Tuesday; T
       e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
       F       week-of-month               number            3
    
       V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
       z       time-zone name              zone-name         Pacific Standard Time; PST
       O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
       X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
       x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
       Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
    

    Customize DatePicker with CSS

    Now, let’s say you would like to customize the DatePicker. It is easily possible with JavaFX CSS styling. The following code snippet shows all the CSS customizations you can apply on the DatePicker for full customization. With the following CSS applied, the DatePicker will look as shown in this screenshot.

    JavaFX CSS Customized DatePicker

    * {
      -fx-primary-color: #c26000;
      -fx-secondary-color: #864500;
      -fx-light-grey-color: #d1d1d1;
      /*Set focus color*/
      -fx-focus-color: -fx-secondary-color;
      /*Increase font size*/
      -fx-font-size: 1.5em;
    }
    
    /*-----------------------------------------
    Customize the right button background color
    -------------------------------------------*/
    .date-picker .arrow-button {
      -fx-background-color: -fx-primary-color;
      -fx-background-radius: 0;
    }
    
    .date-picker .arrow-button:hover {
      -fx-background-color: -fx-secondary-color;
    }
    
    .date-picker .arrow-button .arrow {
      -fx-background-color: white;
    }
    
    /*-----------------------------------------
    Customize popup content
    -------------------------------------------*/
    .date-picker .cell {
      -fx-background-color: white;
    }
    
    .date-picker .cell:hover {
      -fx-background-color: -fx-primary-color;
    }
    
    .date-picker .cell:focused {
      -fx-background-color: -fx-primary-color;
    }
    
    /*-----------------------------------------
    Customize the selected cell
    -------------------------------------------*/
    .date-picker .selected {
      -fx-background-color: -fx-primary-color;
      -fx-text-fill: white;
    }
    
    .date-picker .selected:focused {
      -fx-background-color: -fx-primary-color;
      -fx-text-fill: white;
    }
    
    .date-picker-popup {
      -fx-border-color: transparent;
    }
    
    .date-picker-popup .month-year-pane {
      -fx-background-color: -fx-primary-color;
    }
    
    .date-picker-popup .month-year-pane .label {
      -fx-text-fill: white;
    }
    
    .date-picker-popup .week-number-cell {
      -fx-text-fill: -fx-secondary-color;
    }
    
    /*-----------------------------------------
    Customize left and right arrow
    -------------------------------------------*/
    .date-picker-popup .spinner .button .left-arrow,
    .date-picker-popup .spinner .button .right-arrow {
      -fx-background-color: #c2d70e;
    }
    

    Conclusion

    In this tutorial, we have learned how to use DatePicker, format the date, and customize it fully with CSS. You might also be interested in having a look into the following tutorials as well, or checkout our JavaFX tutorial page.

    1. JavaFX animation tutorial
    2. JavaFX scene switching animation
    3. JavaFX icon setup
  • Java TrayIcon Tutorial (With popupmenu and images)

    Java TrayIcon Tutorial (With popupmenu and images)

    Trayicons are really useful widgets for interacting with the application when the main dialog is minimized/hidden or the application is running in the background. In this tutorial, let’s see how to add a Java Tray Icon with example code.

    Note: JavaFX does not have a separate TrayIcon system. If your project is using JavaFX, then the tutorial is still fully applicable. Because the java.awt.SystemTray can be used for JavaFX as well!

    Creating a simple TrayIcon

    The first step on adding a TrayIcon is checking whether the platform supports it. As you know, java supports a wide variety of platforms and not all platforms will support SystemTray feature. So, the first step on configuring it is to check if it is really supported. Let’s see the basic algorithm here

    1. Make sure the platform supports SystemTray
    2. Load image for the trayicon
    3. Create trayicon object and add it to the tray

    Let’s see how it is done in code.

    public void createTrayIcon() {
      //Check for SystemTray support
      if (!SystemTray.isSupported()) {
        System.err.println("System tray feature is not supported");
        return;
      }
    
      //Get system tray object
      SystemTray tray = SystemTray.getSystemTray();
    
      //Create TrayIcon instance
      Image image = ImageIO.read(TrayIconService.class.getResourceAsStream("/path/to/your/icon.png"));
      TrayIcon trayIcon = new TrayIcon(image, "Genuine Coder", null);
      trayIcon.setImageAutoSize(true);
    
      //Attach TrayIcon to SystemTray
      tray.add(trayIcon);
    }
    

    and…That’s it. When you run the code, you will get a nice TrayIcon in your system’s taskbar. Below, you can find the output of running the code on my system.

    Java TrayIcon on windows 10 taskbar

    Creating TrayIcon with PopupMenu

    Now, let’s see how to add a PopupMenu into the TrayIcon to add some functionality. Let’s iterate the steps first.

    1. Create PopumMenu
    2. Create one Menu and multiple MenuItems and organize them in a tree structure
    3. Attach Menu to PopumMenu
    4. Attach PopupMenu to TrayIcon

    Basically, we need to prepare the MenuItems as we intend to and then attcah it to the PopupMenu. As an example, let’s create the following menu.

    Java TrayIcon With PopupMenu

    public void createTrayIcon() {
      //Check for SystemTray support
      if (!SystemTray.isSupported()) {
        System.err.println("System tray feature is not supported");
        return;
      }
      SystemTray tray = SystemTray.getSystemTray();
      Image image = ImageIO.read(TrayIconService.class.getResourceAsStream("/path/to/your/icon.png"));
      TrayIcon trayIcon = new TrayIcon(image, "Genuine Coder", null);
      trayIcon.setImageAutoSize(true);
    
      //Create root menu
      PopupMenu rootMenu = new PopupMenu();
      
      //Add about and restart items
      MenuItem about = new MenuItem("About");
      rootMenu.add(about);
      Menu restartMenu = new Menu("Restart");
      rootMenu.add(restartMenu);
    
      //Add sub-items to server
      MenuItem restartClient = new MenuItem("Client");
      MenuItem restartServer = new MenuItem("Server");
      restartMenu.add(restartClient);
      restartMenu.add(restartServer);
    
      //Attach to trayIcon
      trayIcon.setPopupMenu(rootMenu);
    
      tray.add(trayIcon);
    }
    

    Adding event handling to the TrayIcon

    Now, let’s see how to attach event-handlers to the TrayIcon menu. As an example, let’s show an alert when the “about” MenuItem is clicked.

    about.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "Wow! Java TrayIcon is working!");
        }
    });
    

    With this event-handler, when you click on the “about” MenuItem in the TrayIcon menu, you will get the following alert.
    TrayIcon action with event handler

    Conclusion

    In this tutorial, we have familiarized with Java TrayIcon and added PopupMenu and action listeners into it. TrayIcons can be customized even further by customizing the MenuItem. You can add special MenuItems like CheckBoxMenuItem to add switch behaviour into your SystemTray. You may also want to checkout the following articles

    1. How to send email using Java
    2. Convert JAR to EXE
  • How to fix “trying to overwrite …, which is also in package …” issue in linux

    How to fix “trying to overwrite …, which is also in package …” issue in linux

    Let’s see how to solve the problem of apt or dpkg failing to install packages due to errors like the following. This is happening because the new package you are trying to install is overwriting a file that is part of another installed package.

    dpkg_error trying to overwrite '/usr/lib/x86_64-linux-gnu/libldacBT_enc.so.2.0.2.3', which is also in package libldac:amd64 2.0.2.3~r26478861

    Sample Error Message

    dpkg: error processing archive /tmp/apt-dpkg-install-rf5BLm/15-libldacbt-enc2_2.0.2.3.r4.gaf2dd23-5~ubuntu20.04_amd64.deb (--unpack):
     trying to overwrite '/usr/lib/x86_64-linux-gnu/libldacBT_enc.so.2.0.2.3', which is also in package libldac:amd64 2.0.2.3~r26478861
    Preparing to unpack .../16-libldacbt-abr2_2.0.2.3.r4.gaf2dd23-5~ubuntu20.04_amd64.deb ...
    Unpacking libldacbt-abr2:amd64 (2.0.2.3.r4.gaf2dd23-5~ubuntu20.04) over (2.0.2.3+git20200429+ed310a0-5) ...
    dpkg: error processing archive /tmp/apt-dpkg-install-rf5BLm/16-libldacbt-abr2_2.0.2.3.r4.gaf2dd23-5~ubuntu20.04_amd64.deb (--unpack):
     trying to overwrite '/usr/lib/x86_64-linux-gnu/libldacBT_abr.so.2.0.2.3', which is also in package libldac:amd64 2.0.2.3~r26478861
    

    How to resolve the “trying to overwrite” Issue?

    There are multiple solutions below based on when the error occurred. If you got the issue while running an apt command, then check the apt section. If it happened while running a dpkg command, then check the dpkg section.

    With DPKG

    If the error occurred while you were executing the apt command, then use the command as follows.

    sudo dpkg -i --force-overwrite theDebYouWantToInstall.deb
    sudo apt-get --fix-broken install
    

    This command will install the deb file with file overwriting when needed.

    With APT

    If the error occurred while you were executing the dpkg command, then use the command as follows.

    sudo apt-get -o Dpkg::Options::="--force-overwrite" [YourAptActionCommand]
    
    #An Example
    sudo apt-get -o Dpkg::Options::="--force-overwrite" dist-upgrade
    
    #Another Example
    sudo apt-get -o Dpkg::Options::="--force-overwrite" apt-get install nmap
    

    This command will install the deb file with file overwriting when needed.

  • JavaFX Application Icon Setup

    JavaFX Application Icon Setup

    All programs require a nice-looking icon or logo on the taskbar and the window to make it look professional. JavaFX provides easy ways to set up an application icon using any image of your choice, whether it be JPG or PNG or something else. In this tutorial, let’s see how to set up an icon for the application

    Set JavaFX Window/Stage icon from an image file

    The usual method of attaching an icon to the JavaFX application is that, you simply include the icon image inside the JAR file as a resource and then use it. Let’s see how you can do that.

    Step 1: Add the icon to the resource directory

    First, add the image into the resource directory. You can use any supported image formats, like PNG, JPEG etc.

    JavaFX Add Image Resource

    Step 2: Attach the icon to the application window

    Now, let’s attach the image from the resource directory to the window, aka stage. The following code snippets show how to do that in an example program.

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.image.Image;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    public class JavaFXIconExample extends Application {
    
      @Override
      public void start(Stage stage) {
        Scene scene = new Scene(new StackPane(), 320, 320);    
    
        //Attach the icon to the stage/window
        stage.getIcons().add(new Image(JavaFXIconExample.class.getResourceAsStream("/logo.png")));
    
        stage.setTitle("Sample program!");
        stage.setScene(scene);
        stage.show();
      }
    
      public static void main(String[] args) {
        launch();
      }
    }
    

    So in the above example, we are attaching the icon to the primary stage (also known as root stage). If you want to add logo to the other stages you create, you can repeat the same process again to add icons to them as well, with just one line of code.

    stage.getIcons().add(new Image(JavaFXIconExample.class.getResourceAsStream("/logo.png")));
    

    JavaFX Application With Custom Icon

    Set icon from an image URL

    Now, let’s say you want to add the image dynamically from a URL instead of adding from an image file, that is also easily possible. This can be done with just one line of code, as shown below.

    stage.getIcons().add(new Image("https://genuinecoder.com/wp-content/uploads/2022/06/genuine_coder-3.png"));
    

    In this example, I have used genuine coder logo to dynamically load the application icon. The advantage of using the logo from a URL is that, you can change the logo in the server without touching your program once it is rolled out to your customers.

    Conclusion

    JavaFX provides a one-line option to attach images/logo to the windows. The logo image can be loaded from an image file or from a URL.

  • Downloading a file from spring controller with spring boot

    Downloading a file from spring controller with spring boot

    Sometimes, we will have to provide rest API endpoint for downloading certain files. In this article, we will see how to provide an option to download any file from a java spring rest API controller, with example code snippet. We will use spring-boot annotations here to make things easier and straightforward. This method provides the file download option with resume support.

    Configure a file for download with spring controller

    Let’s assume that you have a file that you want to provide for download at “data/file_to_download.mp4”. Then you can write the controller as follows to make it downloadable by any browser. Also, the REST API endpoint is given in the @GetMapping annotation.

    @GetMapping(path = "/your-api/get-video-file")
    public ResponseEntity<Resource> downloadFile() throws Exception {
        File downloadFile = new File("data/file_to_download.mp4");
        InputStreamResource resource = new InputStreamResource(new FileInputStream(downloadFile));
        HttpHeaders header = new HttpHeaders();
        header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + downloadFile.getName());
        header.add("Cache-Control", "no-cache, no-store, must-revalidate");
        header.add("Pragma", "no-cache");
        header.add("Expires", "0");
        return ResponseEntity.ok()
            .headers(header)
            .contentLength(downloadFile.length())
            .contentType(MediaType.parseMediaType("application/octet-stream"))
            .body(resource);
    }
    

    The “application/octet-stream” media type is useful for providing the file as a raw type. The HttpHeader provides information about the file metadata, including the size of the file so that the browser can properly determine its size and create a proper download progress bar.

    Providing spring boot file download based on GET parameter

    Now, let’s say you want to provide multiple files for download and don’t want to write separate functions for each. In this case, you can simply accept the name of the file to be downloaded as a request parameter and use it to process the file downloading. Let’s see how this can be done in the following code snippet.

    Firefox download dialog from the spring boot file download link

    @GetMapping(path = "/your-api/download-file")
    public ResponseEntity<Resource> downloadBenchmarkFile10Mb(@RequestParam("file-name") String fileName) throws Exception {
      File downloadFile = new File(fileName);
      //Return 404 error if the file is not found
      if (!downloadFile.exists()) {
        return ResponseEntity.noContent()
            .build();
      }
      InputStreamResource resource = new InputStreamResource(new FileInputStream(downloadFile));
      HttpHeaders header = new HttpHeaders();
      header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + downloadFile.getName());
      header.add("Cache-Control", "no-cache, no-store, must-revalidate");
      header.add("Pragma", "no-cache");
      header.add("Expires", "0");
      header.add("hash", FileUtil.createFileHash(downloadFile));
      return ResponseEntity.ok()
          .headers(header)
          .contentLength(downloadFile.length())
          .contentType(MediaType.parseMediaType("application/octet-stream"))
          .body(resource);
    }
    

    Here, the file-name to be downloaded will be taken as an argument from the GET request and then will be used for resolving the file. If such a file is not available, then a 404 response will be returned, as you can see in the code comment. To download from the following REST GET endpoint, you can make a request as follows.

    https://yourserver/your-api/download-file?file-name=zulu.tar.gz
    

    That’s all about spring boot file download

  • How to update all WordPress post content URLs with SQL

    How to update all WordPress post content URLs with SQL

    Updating all the URLs and resources in the WordPress site after migrating to a new domain or migrating to a domain from IP address is a painstaking task. Luckily, there is an easy way!

    In this tutorial, I will show you the easy way to update all URLs thanks to SQL commands. The first thing you need is access to PhpMyAdmin tool or direct shell access to the database server. Once you have the database accesses, you can follow the below-mentioned steps to update all domains/IP address in your posts, comments, etc. to the new domain address.

    PhpMyAdmin giving option for running SQL query
    PhpMyAdmin giving option for running SQL query

    Find and update all the posts with old domain in the contents

    The following SQL query lists all the posts that contain the old domain. This is only for seeing the posts that have the old domain. 

    SELECT * FROM wp_posts WHERE post_content LIKE '%YOUR_OLD_DOMAIN%'

    Now, let’s replace all those old domain URLs with the new one with the following SQL command.

    UPDATE wp_posts SET post_content = replace(post_content, 'YOUR_OLD_DOMAIN', 'YOUR_NEW_DOMAIN') 
    WHERE post_content LIKE '%YOUR_OLD_DOMAIN%'
    

    Find and update all the comments with old domain

    Similar to what we have done with post content, we can replace the old domain in the comments too.

    The following SQL query lists all the comments that contain the old domain.

    SELECT * FROM wp_comments WHERE comment_content LIKE '%YOUR_OLD_DOMAIN%'
    

    Then to replace all those old domains in the comment, use the following SQL command

    UPDATE wp_comments SET comment_content = replace(comment_content, 'YOUR_OLD_DOMAIN', 'YOUR_NEW_DOMAIN') 
    WHERE comment_content LIKE '%YOUR_OLD_DOMAIN%'
    
    This should make all the URLs use your new domain.
  • Bubble Sort Algorithm Visualization

    Bubble Sort Algorithm Visualization

    Bubble sort is a relatively simple sorting algorithm. It works by repeatedly fixing sort order between adjacent elements. Bubble sort is very popular yet not suitable for sorting large datasets since it has an average and worst case complexity of O(n2). Today I am sharing bubble sort algorithm visualization to get better understanding of it.

    View Project in GitHub

    In the following video, you could see the bubble sorting in action. The dataset (array to be sorted) is generated using random functions and it has a size of 500. The visualization is implemented using JavaFX.

    This visualization is implemented with the help of Chart component in JavaFX. I have used a javafx.scene.chart.BarChart. You can learn more about using JavaFX chart from this link.

  • Send email from Java application using Java Mail API

    Send email from Java application using Java Mail API

    Java Mail API allows to send emails from your Java application. Very often it will be necessary to send emails when you are developing a business related applications or simply hobby projects.

    Using Java Mail API is relatively straightforward. First you need to add the API to your application. You can download the JAR file from https://javaee.github.io/javamail/

    You need following data fields to send email

    • An account to send email from.
    • Password of your email account.
    • SMTP server host address
    • SMTP server port.

    In the following example, we will use gmail account for sending email. For google, SMTP server host address is “smtp.gmail.com” and port is “587”.

    Enable Less Secure Access in Gmail

    Google recently updated their security by automatically disabling access from third-party application. So you have to enable less secure access from gmail settings in order to use that account from java application.

    You can enable it from https://myaccount.google.com/security

    If you haven’t enabled it, you will get following email when you try to send email.

    Sign-in attempt was blocked.
    Someone just used your password to try to sign in to your account from a non-Google app. Google blocked them, but you should check what happened. Review your account activity to make sure no one else has access.


    Enable less secure app access from Google settings

    Program for sending email using Java Mail API and Gmail account

        public static void sendMail(String recepient) throws Exception {
            System.out.println("Preparing to send email");
            Properties properties = new Properties();
    
            //Enable authentication
            properties.put("mail.smtp.auth", "true");
            //Set TLS encryption enabled
            properties.put("mail.smtp.starttls.enable", "true");
            //Set SMTP host
            properties.put("mail.smtp.host", "smtp.gmail.com");
            //Set smtp port
            properties.put("mail.smtp.port", "587");
    
            //Your gmail address
            String myAccountEmail = "[email protected]";
            //Your gmail password
            String password = "xxxxxxxx";
    
            //Create a session with account credentials
            Session session = Session.getInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(myAccountEmail, password);
                }
            });
    
            //Prepare email message
            Message message = prepareMessage(session, myAccountEmail, recepient);
    
            //Send mail
            Transport.send(message);
            System.out.println("Message sent successfully");
        }
    
        private static Message prepareMessage(Session session, String myAccountEmail, String recepient) {
            try {
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress(myAccountEmail));
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
                message.setSubject("My First Email from Java App");
                String htmlCode = "<h1> WE LOVE JAVA </h1> <br/> <h2><b>Next Line </b></h2>";
                message.setContent(htmlCode, "text/html");
                return message;
            } catch (Exception ex) {
                Logger.getLogger(JavaMailUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }

  • JavaFX 3D Tutorial #12 – Depth Buffer

    JavaFX 3D Tutorial #12 – Depth Buffer

    So far, we have learned about the basics of 3D. We created 3D objects, prepared detailed textures, worked with animation etc. In this chapter, we will talk about the requirement of depth buffer.

    What is Depth Buffer?

    Depth buffering or Z-Buffering is a computer graphics technique used to determine surface depths at each pixel to decide which objects are visible. For example, when there are couple of objects in the scene graph, some edges of will be on top and some will be behind others. In order to identify and render these properly, it is important to fix the depth of each of the objects at each pixels.

    By default, in JavaFX Scenes, depth buffer is disabled. But, it can be easily enabled by using the following overridden constructor.

    Scene(Parent root, double width, double height, boolean depthBuffer)

    Just pass the final parameter as true and depth buffer will automatically enabled.

    SmartGroup group = new SmartGroup();
    group.getChildren().add(createBox());
    
    //Create new scene with depth buffer enabled
    Scene scene = new Scene(group, WIDTH, HEIGHT, true);
    

     

    Effects of not enabling depth buffer

    Following image shows the effect of using depth buffer. In the first image (image on the left), the wooden boxes were supposed to merged. But, since depth buffer is not used, the rendering is not proper and they appear to be two different boxes. When depth buffer is enabled, it is rendered correctly as it can be seen in the second image.

    JavaFX Depth Buffer Enabled / Disabled

    Visit JavaFX 3D Course Index Page

  • JavaFX 3D Tutorial #11 – Bump Maps for Wringles

    JavaFX 3D Tutorial #11 – Bump Maps for Wringles

    In the last chapter, we saw how to create glowing objects with self illumination. In this chapter, we will see about bump mapping in JavaFX.

    Bump Maps

    According to Wikipedia, Bump mapping is a computer graphics technique for simulating bumps and wrinkles on the surface of an object. Surfaces are not always super smooth. They mostly have some form of deformations. Bump mapping allows to add this extra detail to the surface.

    JavaFX PhongMaterial provides option to set bump maps using the method.

    public final void setBumpMap(Image value)

    Let’s have a look at example code snippet.

    PhongMaterial material = new PhongMaterial();
    material.setDiffuseMap(new Image(getClass().getResourceAsStream("wood.jpg")));
    
    //Set bump map
    material.setBumpMap(new Image(getClass().getResourceAsStream("bumpMap.jpg")));
    
    Box box = new Box(100, 20, 50);
    box.setMaterial(material);
    return box;
    

     

    Visit JavaFX 3D Course Index Page

  • JavaFX 3D Tutorial #10 – Self Illumination

    JavaFX 3D Tutorial #10 – Self Illumination

    In JavaFX 3D, you can make use of self illumination maps to provide glowing effects for objects. Self illumination allows to add extra details for the objects.

    Self Illumination Map

    Self illumination map allows to add an additional glow to the image. You can see the effect in the following image.

    JavaFX Self Illumination Example

    JavaFX PhongMaterial provides an option to set illumination map using the method

    public final void setSelfIlluminationMap(Image value)

    It takes an image as parameter. The glow color will be the color used in image. A dark pixel doesn’t contribute to the glow. For example, in the above earth illumination case, I have used following illumination map.

    Earth’s illumination map

     

    PhongMaterial material = new PhongMaterial();
    material.setDiffuseMap(new Image(getClass().getResourceAsStream("wood.jpg")));
    
    //Set self illumination map
    material.setSelfIlluminationMap(new Image(getClass().getResourceAsStream("illuminationMap.jpg")));
    
    Box box = new Box(100, 20, 50);
    box.setMaterial(material);
    return box;
    

     

    Visit JavaFX 3D Course Index Page

  • JavaFX 3D Tutorial #9 – Moving Light Animation

    JavaFX 3D Tutorial #9 – Moving Light Animation

    In the last chapter, we saw how to add lights to the 3D scene. In this chapter, we will see how a moving light works.

    You can add as many lights as you need. To animate the light sources, you can use predefined animations from javafx.animation package like TranslateTransition, RotateTransition etc or custom animations can be applied. In this example, I will write a custom rotation animation to get the following effect.

    JavaFX Light Animation

    Moving Light Animation

    We can create the rotation effect for the light source using rotateProperty. The important thing here is to specify the axis of rotation. We have the freedom to rotate the object in 360 degrees. In this example, I am rotating light source about X Axis.

    AnimationTimer will be called during each frame rendered. We can update the transform properties of objects to create smooth animation. In this example, I have increased rotation angle of light source by 1 degree during each frame.

    You can speedup the animation by increasing the value ‘1’ to a higher one. Animation speed can be reduced by reducing the value.

    private Node[] prepareLightSource() {
        //Create point light
    	pointLight.setColor(Color.RED);
    	pointLight.getTransforms().add(new Translate(0, -50, 100));
    	//Set axis of rotation
    	pointLight.setRotationAxis(Rotate.X_AXIS);
    
    	//Create a small sphere to locate the light source (Light source is invisible)
    	Sphere sphere = new Sphere(2);
    	//Attach sphere transforms to point light. So they move/rotate together
    	sphere.getTransforms().setAll(pointLight.getTransforms());
    	sphere.rotateProperty().bind(pointLight.rotateProperty());
    	sphere.rotationAxisProperty().bind(pointLight.rotationAxisProperty());
    
    	//Return lights
    	return new Node[]{pointLight, sphere};
    }
    
    @Override
    public void start(Stage primaryStage) {
    	Box box = prepareBox();
    
    	SmartGroup group = new SmartGroup();
    	group.getChildren().add(box);
    	//Add light and sphere
    	group.getChildren().addAll(prepareLightSource());
    
    	Camera camera = new PerspectiveCamera(true);
    	camera.setNearClip(1);
    	camera.setFarClip(1000);
    	camera.translateZProperty().set(-200);
    
    	Scene scene = new Scene(group, WIDTH, HEIGHT);
    	scene.setFill(Color.SILVER);
    	scene.setCamera(camera);
    
    	group.translateXProperty().set(0);
    	group.translateYProperty().set(0);
    	group.translateZProperty().set(0);
    
    	initMouseControl(group, scene, primaryStage);
    
    	primaryStage.setTitle("Genuine Coder");
    	primaryStage.setScene(scene);
    	primaryStage.show();
    
    	//Create animation timer
    	AnimationTimer timer = new AnimationTimer() {
    	  @Override
    	  public void handle(long now) {
    		//Increase rotation angle by 1 degree during each frame.
    		pointLight.setRotate(pointLight.getRotate() + 1);
    	  }
    	};
    	//Start animation automatically during startup
    	timer.start();
    }
    

     

    Visit JavaFX 3D Course Index Page

  • JavaFX 3D Tutorial #8 – Lighting with PointLight and AmbientLight

    JavaFX 3D Tutorial #8 – Lighting with PointLight and AmbientLight

    In this chapter, we will see how to add lighting to the JavaFX 3D. Lighting is one of the most important parts in 3D application development since it decides what should be visible at a point of time.

    JavaFX provides two options for lighting. One is AmbientLight and another one is PointLight.

    Ambient Light

    An ambient light radiates lights equally in all directions. When it is used, all the surfaces of the 3D object get equal amount of light. It can be considered as a natural default light.

    Let’s see how we can add Ambient Light. You can give the color of the light by using setColor() method.

    private LightBase prepareLightSource() {
            //Create light object
    	AmbientLight light = new AmbientLight();
    	//Set light color
    	light.setColor(Color.DEEPSKYBLUE);
    	return light;
    }
    

    Screenshot:-

    Point Light

    A point light can be considered as a light bulb that emits light in all directions. You can think of a point light as a sphere of light filling an area. Objects closer to the light will be brighter, and objects further away will be darker. JavaFX allows to add point light using javafx.scene.PointLight class.

    private LightBase prepareLightSource() {
    	//Create point light
    	PointLight pointLight = new PointLight();
    	//Set light color
    	pointLight.setColor(Color.RED);
    	//Set location of light source
    	pointLight.getTransforms().add(new Translate(0,-50,100));
    }
    

    Screenshot:-

    Visit JavaFX 3D Course Index Page

  • JavaFX 3D Tutorial #7 – Reflection with Specular Map

    JavaFX 3D Tutorial #7 – Reflection with Specular Map

    In the 6th chapter, we talked about giving wooden texture to the object. Today, let us see how to give reflection to surfaces in JavaFX 3D. JavaFX provides option to specify specular maps as either image or a color.

    Specular Map

    Specular maps allows to define a surface’s shininess and highlight colour. The higher the value of a pixel (from black to white), the shinier the surface will appear. Black provides zero reflection and white provides total reflection.

    If you want the surface to be having uniform reflection, then use a specular color with Material#setSpecularColor(Color color). Or use Material#setSpecularImage(Image image).

    Let’s have a look at the example code.

    private Box prepareBox() {
       PhongMaterial material = new PhongMaterial();
       //Set diffuse map
       material.setDiffuseMap(new Image(getClass().getResourceAsStream("/resources/wood.jpg")));
       //Set specular map
       material.setSpecularMap(new Image(getClass().getResourceAsStream("/resources/illuminati.jpg")));
    
       Box box = new Box(100, 20, 50);
       box.setMaterial(material);
       return box;
    }
    

    and the result will be

    JavaFX 3D Box with Reflection

     

    Specular Map used

     

     

     

     

    Visit JavaFX 3D Course Index Page

    Meta titles: JavaFX Reflection, JavaFX 3D Specular Map

  • JavaFX 3D Tutorial #6 – Textures with Diffuse Map

    JavaFX 3D Tutorial #6 – Textures with Diffuse Map

    In this chapter, we will talk about applying textures with diffuse map. In 3D programming, texture is one of the most important parts because it provides that actual look and feel of an object by adding details on its surface.

    JavaFX and PhongMaterial

    In the javafx.scene.paint package, you can see a class that extends Material abstract class, the PhongMaterial. PhongMaterial allows to create virtual materials that can be applied over your 3D object to create real-world like objects.

    Before diving directly in to the code, let’s have a look at what exactly is the Diffuse Map.

    What is a Diffuse Map ?

    According to the definition, Diffuse mapping (also know as texture mapping) refers to a computer graphics method that simply wrapped and mapped pixels from a texture to a 3D surface. It defines the color property of the surface. For example, if you want to color your object to red, you simply apply red diffuse map over it, it will become red.

    If you would like to read more about it, have a look at cryengine doc.

    Apply Color Over The Surface

    JavaFX PhongMaterial provides two option to apply a diffuse map. Either using a color or using an image. If you use a color, then the whole object will be painted with that color.

    Let’s see how setting a color works.

    //Create Material
    PhongMaterial material = new PhongMaterial();
    //Applying JavaFX Diffuse Map with Color Royal Blue[/caption] Royal blue color
    material.setDiffuseColor(Color.ROYALBLUE));
    Box box = new Box(100, 20, 50);
    //Apply material for the box
    box.setMaterial(material);
    

     

    JavaFX: Royal blue color applied as Diffuse Map

    So, using the PhongMaterial’s setDiffuseColor(Color.ROYALBLUE), we set the color of the surface. You can set any color you want.

    Apply Texture Over The Surface

    Colors are suitable in some cases. But, in most cases, we need something more complex than some simple colors. JavaFX provides option to set diffuse map using an Image. You can simply apply any image as texture for your object.

    Let’s see how a wooden texture works on our box.

    //Create Material
    PhongMaterial material = new PhongMaterial();
    //Applying wooden texture
    material.setDiffuseMap(new Image(getClass().getResourceAsStream("wood.jpg")));
    Box box = new Box(100, 20, 50);
    //Apply material for the box
    box.setMaterial(material);
    

    And it looks as follows. Pretty awesome, right?

    JavaFX Diffuse Map with Woode Image

    and that’s it. It is just 3 lines of code to apply a complex texture on your object. If you look at the set* methods of PhongMaterial, you will find a lot more methods. The thing is, diffuse map is just a start. You can make your objects with great amount of detail with these options. We will discover those methods in the upcoming chapters.

    Visit JavaFX 3D Course Index Page

  • JavaFX 3D Tutorial #5 – More fine mouse control – Zoom in and Zoom out

    JavaFX 3D Tutorial #5 – More fine mouse control – Zoom in and Zoom out

    In this chapter, we will implement the mouse zoom control. Currently we have complete rotation freedom on the mouse. With Zoom in/out effect, we can control the Z-axis.

    This zoom control will be based on mouse scrolling. JavaFX provides option to listen for mouse scroll event. We will make use of that.

    //Attach a scroll listener
    stage.addEventHandler(ScrollEvent.SCROLL, event -> {
            //Get how much scroll was done in Y axis.
    	double delta = event.getDeltaY();
            //Add it to the Z-axis location.
    	group.translateZProperty().set(group.getTranslateZ() + delta);
    });
    

    ScrollEvent.SCROLL allows to track the scrolling. JavaFX provides support for tracking horizontal scrolling (which can be obtained using event.getDeltaX()) as well as vertical scrolling (which can be obtained using event.getDeltaY()). Currently we are interested in vertical scrolling only.

    When we scroll upward, the value will be positive. Then the Z axis value will increase and object will go away. When the scroll is downward, Z value will be decreased and the object will come closer.

    Visit JavaFX 3D Course Index Page

  • JavaFX Communication Between Controllers

    JavaFX Communication Between Controllers

    When you begin with JavaFX, one problem you might come up with is the communication between different controllers to communicate between scenes. In this article, we will see how to properly communicate between two different controllers in JavaFX.

    JavaFX Controller Communication Method

    The solution here is to get the controller from FXMLLoader. We use JavaFX FXMLLoader for inflating fxml and loading new views. This loader has a method called getController(). getController method will return an instance of the controller corresponding to the view we are going to load.

    In this example, we take input to a text field from the user. When a button is clicked, new window will be opened and we pass the typed text to new window.

    First Scene Controller

    When the button actionBtn is clicked, a new window will be called which is the second scene window. We take the input from inputField textfield and pass it with transfer data.

    public class Scene1Controller implements Initializable {
    
        @FXML
        private TextField inputField;
        @FXML
        private Button actionBtn;
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            //When button clicked, load window and pass data
            actionBtn.setOnAction(event -&amp;amp;amp;amp;amp;amp;amp;gt; {
                loadSceneAndSendMessage();
            });
        }
    
        private void loadSceneAndSendMessage() {
            try {
                //Load second scene
                FXMLLoader loader = new FXMLLoader(getClass().getResource("/javafxcontrollercommunication/scene2/scene2.fxml"));
                Parent root = loader.load();
    
                //Get controller of scene2
                Scene2Controller scene2Controller = loader.getController();
                //Pass whatever data you want. You can have multiple method calls here
                scene2Controller.transferMessage(inputField.getText());
    
                //Show scene 2 in new window
                Stage stage = new Stage();
                stage.setScene(new Scene(root));
                stage.setTitle("Second Window");
                stage.show();
            } catch (IOException ex) {
                System.err.println(ex);
            }
        }
    }
    

    Second Scene Controller

    This controller is elementary. You just have to write a method that accepts the string. Once the string is received, we set that in the display TextField.

    public class Scene2Controller {
        @FXML
        private TextField display;
    
        //Receive message from scene 1
        public void transferMessage(String message) {
            //Display the message
            display.setText(message);
        }
    }
    

    Watch another example on YouTube


    You may also find following interesting:-

    View in Github
    [JavaFX communicate between scenes, JavaFX window communication. JavaFX share data between scenes]

  • JavaFX Splash Screen

    JavaFX Splash Screen

    Splash screens are awesome. They allows to engage users when the application load in the background as a loading screen. In this article, we will talk about implementing JavaFX Splash Screen / Loading Screen with animation. For the splash screen, we will provide a fade-in and fade-out transition.

    Splash Screen with Fade Animation

    In this example, when the program starts, the splash screen will fade in. After some time, the flash screen will fade out.

    The algorithm is as follows

    • Load Preloader with a fade-in effect using FadeTransition
    • Remove Preloader with a fade-out effect using Fade transition.
    • On the end of fade-out load the actual content to the frame.

    Watch the implementation:-

    Let’s have a look at the code. The code is properly commented.

    private void loadSplashScreen() {
    	try {
    		//Load splash screen view FXML
    		StackPane pane = FXMLLoader.load(getClass().getResource(("myAwesomeSplashDesign.fxml")));
    		//Add it to root container (Can be StackPane, AnchorPane etc)
    		root.getChildren().setAll(pane);
    
    		//Load splash screen with fade in effect
    		FadeTransition fadeIn = new FadeTransition(Duration.seconds(3), pane);
    		fadeIn.setFromValue(0);
    		fadeIn.setToValue(1);
    		fadeIn.setCycleCount(1);
    
    		//Finish splash with fade out effect
    		FadeTransition fadeOut = new FadeTransition(Duration.seconds(3), pane);
    		fadeOut.setFromValue(1);
    		fadeOut.setToValue(0);
    		fadeOut.setCycleCount(1);
    
    		fadeIn.play();
    
    		//After fade in, start fade out
    		fadeIn.setOnFinished((e) -> {
    			fadeOut.play();
    		});
    
    		//After fade out, load actual content
    		fadeOut.setOnFinished((e) -> {
    			try {
    				AnchorPane parentContent = FXMLLoader.load(getClass().getResource(("/main.fxml")));
    				root.getChildren().setAll(parentContent);
    			} catch (IOException ex) {
    				Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
    			}
    		});
    	} catch (IOException ex) {
    		Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
    	}
    }
    

    How to show splash screen until loading gets completed

    Sometimes you may want to do some actual work like loading a database or importing something. In this case, we will have to do it in the background while splash screen is shown.

    You can do the heavy lifting tasks on the setOnFinished() method of fade-in transition.

    fadeIn.setOnFinished((e) -> {
        //Do the loading tasks
        DatabaseImporter.import();
        SomeComplexTask.start();
        //...
        //After the background tasks are done, load the fadeout
        fadeOut.play();
    });
    
    Problem with this approach

    The above code works fine when the background tasks are not that much (when the tasks complete within couple of seconds max). But if it is a long task, then the JavaFX UI Thread will hang. In this case, you might have to use a separate thread for processing the background tasks.

    The reliable solution

    You can make use of JavaFX Tasks or JavaFX Services. Then using a task complete listener, you can initiate fade out transition.

    fadeIn.setOnFinished((e) -> {
        //Start the Worker Task
        BackgroundWorkerTask task = new BackgroundWorkerTask();
        task.start();
        //After the completion of the task, start fadeOut animation
        task.setOnSucceeded(successEvent -> {
          fadeOut.play();
        });
    });
    

    So, that’s how you implement a JavaFX Splash Screen.

    See example on GitHub

    JavaFX Splash Screen without Borders

    In this video tutorial, you can see how to make a splash screen in a separate window without window borders. Here, splash screen uses a separate stage.

  • JavaFX 3D Tutorial #4 – 3D Object Transform (Rotation) with Mouse

    JavaFX 3D Tutorial #4 – 3D Object Transform (Rotation) with Mouse

    In the previous chapter, we saw how to do the transforms with keyboard input. In this chapter, we take it a step further. Today, we will talk about JavaFX 3D Mouse Control implementation. Giving control using mouse is more reliable than keyboard. With mouse control, user can directly interact with the 3D application.


    The basic idea is to track the mouse drag. Based on how much drag is made in x and y-axis, we apply rotation transformation.

    The following method will do the trick.

     //Tracks drag starting point for x and y
     private double anchorX, anchorY;
     //Keep track of current angle for x and y
     private double anchorAngleX = 0;
     private double anchorAngleY = 0;
     //We will update these after drag. Using JavaFX property to bind with object
     private final DoubleProperty angleX = new SimpleDoubleProperty(0);
     private final DoubleProperty angleY = new SimpleDoubleProperty(0);
    
     private void initMouseControl(SmartGroup group, Scene scene) {
        Rotate xRotate;
        Rotate yRotate;
        group.getTransforms().addAll(
            xRotate = new Rotate(0, Rotate.X_AXIS),
            yRotate = new Rotate(0, Rotate.Y_AXIS)
        );
        xRotate.angleProperty().bind(angleX);
        yRotate.angleProperty().bind(angleY);
    
        scene.setOnMousePressed(event -> {
          anchorX = event.getSceneX();
          anchorY = event.getSceneY();
          anchorAngleX = angleX.get();
          anchorAngleY = angleY.get();
        });
    
        scene.setOnMouseDragged(event -> {
          angleX.set(anchorAngleX - (anchorY - event.getSceneY()));
          angleY.set(anchorAngleY + anchorX - event.getSceneX());
        });
      }
    

    Let’s discuss the code parts.

    Step 1: Prepare and apply initial rotation transformation
    //Prepare X and Y axis rotation transformation obejcts
    Rotate xRotate;
    Rotate yRotate;
    //Add both transformation to the container
    group.getTransforms().addAll(
    	xRotate = new Rotate(0, Rotate.X_AXIS),
    	yRotate = new Rotate(0, Rotate.Y_AXIS)
    );
    /*Bind Double property angleX/angleY with corresponding transformation.
      When we update angleX / angleY, the transform will also be auto updated.*/
    xRotate.angleProperty().bind(angleX);
    yRotate.angleProperty().bind(angleY);
    
    Step 2: Track starting of mouse drag.

    It is necessary to track the drag start. Because, we will have to track how much the drag was happened in both axes.
    A drag always start with a mouse press.

    //Listen for mouse press -- Drag start with a click :-)
    scene.setOnMousePressed(event -> {
      //Save start points
      anchorX = event.getSceneX();
      anchorY = event.getSceneY();
      //Save current rotation angle
      anchorAngleX = angleX.get();
      anchorAngleY = angleY.get();
    });
    
    Step 3: Calculate angle of rotation based on current drag point

    When the user start dragging, after each pixel (or minor dragging), we will get a callback. We will check current (x,y) value and compare it with previous to calculate the rotation delta.

    //Listen for drag
    scene.setOnMouseDragged(event -> {
        /*event.getSceneY() gives current Y value. Find how much far away
          it is from saved anchorY point.
         */
        angleX.set(anchorAngleX - (anchorY - event.getSceneY()));
        angleY.set(anchorAngleY + anchorX - event.getSceneX());
    });
    

    It is important to note that, when the user drags in Y axis, we have to rotate based on X axis and vice versa (Try the opposite and see how much weird it is). The negative symbol in angleX is to set the direction of rotation. You can change the direction by changing the subtraction to addition.

    Visit JavaFX 3D Course Index Page

    Find Code in GitHub