Pubblicato il 23/12/2023 da alnao nella categoria Java & Spring Boot

Con la sigla GUI (Graphical User Interface) si intendono le applicazioni con una interfaccia grafica che permette all’utente di iteragire con i dati, questo concetto comprende anche le applicazioni formate da finestre, bottoni, labels e così via. Le librerie Swing e JavaFX sono tra le due più comuni usate per creare applicazioni GUI con il linguaggio Java, in questo articolo sarà introdotta la prima libreria che è la più usata dai programmatori anche se è sempre meno usata visto che questo tipo di applicazioni è stato sostituito dalle applicazioni web. Questa si basa su’altra libreria AWT di cui è, de facto, una estensione, si rimanda ai tantissimi siti per maggiori informazioni riguardo alla libreria e le sue caratteristiche.

La guida ufficiale introduce un semplice esempio dove si costruisce una semplice classe per la visualizzazione di una finestra con un messaggio semplice messaggio:

import javax.swing.*; 
public class HelloWorldSwing {
  private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("HelloWorldSwing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Add the ubiquitous "Hello World" label.
    JLabel label = new JLabel("Hello World");
    frame.getContentPane().add(label);
    //Display the window.
    frame.pack();
    frame.setVisible(true);
  }
  public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}

Per la creazione di un progetto si può usare qualunque archetipo di tipo maven, la libreria Swing infatti si trova nel package base javax che si trova in qualunque SDK standard e non necessita librerie aggiuntive aggiunte come dipendenze nel file di configurazione.

Questa libreria si basa principalmente sull’uso della classe JFrame che definisce il comportamento della principale finestra, per esempio:

frame = new JFrame("Aws J Console");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setLocationByPlatform(true);
frame.setSize(200,200);
frame.setContentPane(contentPane); 
frame.pack();
frame.setJMenuBar(Menu.createMenuBar(... , this ));
frame.setVisible(true);

si rimanda alla documentazione ufficiale per maggiori dettagli.


Un bellissimo progetto di applicazione costruita in Java con Swing è Jedit: un semplice editor di testo costruito per funzionare su tutti i sistemi operativi.

Per esempio per definire una lista con un metodo che descrive il compormaento al click di un elemento

public JScrollPane createListPanel(...) throws FileNotFoundException {
  String[] columnNames = {"NOME"};
  String[][] data = new String[listB.size()][1];
  for (int i=0;i<listB.size();i++) {
    data[i][0]=listB.get(i).name();
  } 
  JTable table = new JTable(data , columnNames){
    private static final long serialVersionUID = 1L;
    public boolean isCellEditable(int row, int column) { 
      return false; 
    };
  };
  table.getColumnModel().getColumn(0).setPreferredWidth(200);
  table.setPreferredSize(new Dimension(100,200));
  table.addMouseListener(new java.awt.event.MouseAdapter() {
    @Override
    public void mouseClicked(java.awt.event.MouseEvent evt) {
      JTable target = (JTable) evt.getSource();
      int row = target.rowAtPoint(evt.getPoint());
      int col = target.columnAtPoint(evt.getPoint());
      System.out.println("Click on" + row + "-" + col);
    }
  });
  JScrollPane p = new JScrollPane(table);//table
  p.setPreferredSize(new Dimension(105,205));
  return p;
}

Per ogni componente sono disponibili molto esempi e tutorial, per esempio sono disponibili molti esempi per la gestione di elenchi e tabelle:

Una semplice applicazione costruita con questa libreria per la gestione di un account AWS, scritta da Alberto Nao, è disponibile nel repository:

https://github.com/alnao/AwsAlNaoConsole/tree/master/awsJConsole
MENU