So, why TotalCross?
TotalCross Components allow for creation of great UIs with very few commands. That means less development time for you.

Corona Chart App Example

The Corona Chart App was coded with TotalCross. RapidAPI was used to fetch data and send it to the chart. The chart itself was coded in less than 150 lines while the whole app used 4 classes adding up to less than 600 lines of code in total.
Corona Chart app
Here is a snippet of how the chart title was coded:

    @Override
    public void initUI() {
        
      (...) // Adding components to UI
      Label lblTitle = new Label("Coronavirus (COVID-19) charts and stats", CENTER);
      lblTitle.setForeColor(Color.WHITE );
      lblTitle.setFont(Font.getFont(true , 36 ));
      add(lblTitle, LEFT , TOP + this.fmH, FILL, PREFERRED);
        
      (...)
      
    }
The Start and Stop button code:

    @Override
    public void initUI() {
        
      (...) // Adding components to UI

      Button btnStartStop = new Button("Start");
      // Adding listener to start or stop the animation
      btnStartStop.addPressListener(e -> {
        if  (btnStartStop.getText().equals("Start")) {
          restartAnimation();
          btnStartStop.setText("Stop");
        } else {
          MainWindow.getMainWindow().removeUpdateListener(updateListener);
          btnStartStop.setText("Start");
        }
      });

      (...)

      add(btnStartStop, LEFT + this.fmH, AFTER + this.fmH);
        
      (...)
      
    }
This is how data was added to the chart:

    private void fillData() {

        confirmedList.clear();
        recoveredList.clear();
        deathsList.clear();
        
        // Getting the information and filling the lists used to fill the CoronaChart
        if (!offlineCheck.isChecked())
            response = getCoronavirusData(
              "https://coronavirus-map.p.rapidapi.com/v1/summary/latest", 
              HttpStream.GET
              );
        else
            response = new JSONObject(new String(Vm.getFile("request.json")));

        JSONObject data = response.getJSONObject("data");
        dates = data.names();
        array = data.toJSONArray(dates);
        for (int i = 0; i < array.length(); i++) {
            date = dates.getString(i);
            item = array.getJSONObject(i);
            MyDate myDate = new MyDate(Integer.parseInt(Convert.remove(date, "-")));
            confirmedList.add(
              new Data<MyDate, Integer>(myDate, item.getInt("total_cases"))
              );
            recoveredList.add(
              new Data<MyDate, Integer>(myDate, item.getInt("recovered"))
              );
            deathsList.add(new Data<MyDate, Integer>(myDate, item.getInt("deaths")));
        }

        // Sorts the data by date;
        Collections.sort(confirmedList, new Comparator<Data<MyDate, Integer>>() {
                
            @Override
            public int compare(Data<MyDate, Integer> o1, Data<MyDate, Integer> o2) {
                return o1.x.compareTo(o2.x);
            }
        });
        Collections.sort(recoveredList, new Comparator<Data<MyDate, Integer>>() {
        
            @Override
            public int compare(Data<MyDate, Integer> o1, Data<MyDate, Integer> o2) {
                return o1.x.compareTo(o2.x);
            }
        });
        Collections.sort(deathsList, new Comparator<Data<MyDate, Integer>>() {
        
            @Override
            public int compare(Data<MyDate, Integer> o1, Data<MyDate, Integer> o2) {
                return o1.x.compareTo(o2.x);
            }
        });
    }
    
Would you like to see more? Here is the project's repository.

On your favorite IDE

TotalCross SDK is compatible with any integrated development environment (IDE) that supports Java, like VSCode, NetBeans, Eclipse, and IntelliJ

High Level Languages

TotalCross uses NanoJava, a leaner version of Java, or more precisely a subset of the language with 72% less classes than full Java. You can also use a subset of Kotlin with TotalCross.