Die Sprache an sich sollte kein Hindernis für einen Anwendungsentwickler sein. Warum werden also explizit Java Entwickler gesucht?

In den Fällen, wo explizit Java-Entwickler gesucht werden, wird es auch darum gehen, Entwickler zu finden, die nicht erst eine Umschulung brauchen, sondern die mit Java und vielleicht auch Java-bezogenen Technologien (z.B. Spring) bereits länger vertraut sind. Es geht darum Kosten und Zeit zu sparen.

(...) da diese Unternehmen wohl so schon nicht verstehen, dass es nicht auf die Programmiersprache ankommt... (...)

Doch, das tut es. Die meisten Unternehmen / Entwicklerteams haben sich auf ein bestimmtes Repertoire an Technologien eingestimmt, wobei es auch die Kunden sind, die einen entsprechenden Einfluss ausüben. Zum Beispiel wenn es darum geht, bestehende Software zu erweitern oder zu warten.

Und warum ist Java immernoch so weit verbreitet?

Java bietet eine stabile Entwicklungsstruktur und überaus starke Community. Es gibt unzählige Frameworks/Bibliotheken für die unterschiedlichsten Bereiche, die Technologie konnte sich über die Zeit weit verbreiten. Das gilt unter anderem auch für die Erneuerung/Neuimplementation von Uraltsystemen (z.B. COBOL-Anwendungen), was man allein wegen der Entwicklungskosten ganz sicher nicht alle 2-3 Jahre mal neu anstößt.

Weiterhin weißt du sicherlich, dass Java eine gut verständliche, relativ leicht erlernbare Sprache ist, die Vorteile wie OOP-Support, Multithreading, Portabilität und Typsicherheit mitliefert. Die Sprache ist schon seit Jahren an vielen Lehreinrichtungen präsent, folglich gibt es einen größeren Pool potenzieller Entwickler.

(...) aber warum schwenken Unternehmen nicht um? Es gibt mittlerweile so viele andere Technologien (...)

Für ein Umschwenken müsste es erst einmal handfeste Gründe geben, die Java im Vergleich zur Konkurrenz nicht mehr tragfähig machen. Das wären beispielsweise extreme Systemwechsel in der Industrie, zu denen Java nicht mehr kompatibel ist, enorme Sicherheits, Stabilitäts- oder Performanceprobleme oder die Einstellung der weiteren Entwicklung des JDK.

Eine große Rolle spielen die wirtschaftlich aufgestellten Interessenshalter, das kannst du an dem Beispiel von VB sehen. Die Sprache gehörte einst zu den populärsten Programmiersprachen weltweit. Microsoft hat sich jedoch dazu entschieden, diese Technologie einzustampfen und sich stattdessen auf C# zu fokussieren.

Im Fall von Java besteht allerdings kein Interesse, einer Aufgabe. Die Technologie ist leistungsstark und findet daher auch bei Unternehmen wie Amazon, IBM oder Microsoft intern Anwendung. Zusätzlich gibt es Organisationen wie Apache oder die Eclipse Foundation, die es sich zur Aufgabe gemacht haben, Java(-Projekte) weiterzuentwickeln und zu warten.

...zur Antwort

Der Projektassistent wurde mit Version 2022.1 verändert (siehe hier). Um ein Java-Projekt anzulegen, brauchst du lediglich ein neues Projekt erstellen (dieser Menüpunkt steht über der Generatorenauswahl). Im rechtsseitigen Dialog, der dir dann für die Projekteinstellungen angezeigt wird, kannst du Java als Sprache auswählen.

...zur Antwort

Bezogen auf den Karriereweg sollte es keinen Unterschied machen, für welche Technologie du dich nun entscheidest. Sowohl C# als auch Java sind sehr populär und decken viele ähnliche Anwendungsgebiete (wie die Webentwicklung) ab. Man kann mit beiden Technologien im Gepäck einen Arbeitsplatz mit guter Bezahlung finden.

Java wurde als plattformunabhängige, portable Technologie konzipiert. Das heißt, du kannst Programme für jedes System entwickeln, zu dem es auch eine JVM gibt (und diese Liste ist nicht kurz). Erwähnenswert in diesem Zusammenhang ist lediglich, dass Apple schon seit Jahren iOS vor Java abschottet. Wenn man mit Java also Programme für iOS entwickeln möchte, klappt das derzeit nur über entsprechende Umwege (z.B. via Plugin-Einbindung in ein Swift-Projekt oder indem man das Java-Projekt via AOC kompiliert).

Der Hauptfokuspunkt für Java liegt in der Webentwicklung (E-Commerce und Enterprise-Applikationen) sowie im Businesssektor (Finanz- und Bankwesen, Datenverwaltung z.B. für Big Data). Auf mobilen Endgeräten (Android OS) oder für IoT/Smart Home-Technologien (z.B. Lichtschalter, Staubsauger, ...) kann man ebenso Java-Programme finden, wobei man hinzufügen sollte, dass Kotlin dabei ist, Java auf Android zu verdrängen.

C# wiederum wird schon aufgrund seiner Historie öfter im Microsoft-Umfeld verwendet. Technisch ist die Sprache trotzdem nicht auf dieses OS beschränkt. Inwiefern eine weitere, tatsächliche Verbreitung auf andere Systeme (Linux, Mac, ...) gelingt, wird die Zeit zeigen. Entsprechende Schritte hat Microsoft bereits vor Jahren eingeleitet, indem das .NET-Kernframework neu implementiert wurde. Aktuell ist man damit beschäftigt, mit dem neuen MAUI-Framework eine Lösung zu etablieren, mit der man GUI-Anwendungen für verschiedene OS (iOS, Android, macOS, Windows) entwickeln kann, ohne dafür die Codebasis wechseln zu müssen.

Solltest du im Übrigen in Erwägung ziehen, in die Spielebranche einsteigen zu wollen, wäre C# die bessere Wahl gegenüber Java. Die Sprache hat sich in diesem Sektor zunehmend ausgebreitet, beliebte Tools wie die Unity Engine oder Godot nutzen/unterstützen sie.

Wenn man die Sprachen in ihrer Syntax miteinander vergleicht, wird man in C# mehr syntaktischen Zucker sowie Einflüsse funktionalen Stils finden, als in Java. Beispielhaft kann man da Expression bodies, top level statements, null coalescing operators oder Properties anführen, mit denen sich der Code erheblich kürzen lässt.

Java wirkt im Gegensatz dazu in seiner Formulierung strikter und behäbiger. In den letzten Jahren hat sich zwar auch bei Java wirklich viel getan, doch mit dem immensen Einbau neuer Features, wie man sie in modernen Sprachen (wie Kotlin oder Scala) findet, tut man sich etwas schwerer.

Das muss man nun nicht sofort als Nachteil werten. Das Entwicklungsteam ist sehr darauf bedacht, das ursprüngliche Konzept zu wahren (Java wurde als reine, strikt typisierte OOP-Sprache ausgelegt). Auf der anderen Seite sind tiefgreifende Änderungen nicht unbedingt einfach. Der Unterbau ist historisch gewachsen und an der Entwicklung von Java sind verschiedene Parteien und Interessenshalter involviert.

Einen weiteren Faktor spielt der Lizenzhalter für die Java-Marke. Oracle verdient mit Java zwar auch Geld, doch es ist nicht deren Haupteinnahmequelle. Das bisherige Verhalten des Unternehmens (z.B. der Rechtsstreit mit Google um die Nutzung von Java auf Android OS) ist m.E. ein Grund, wieso sich andere Technologien wie Kotlin weiter verbreiten.

...zur Antwort

Die erste Anweisung im Schleifenkopf (Initialisierung/Startanweisung) wird ausgeführt, sobald der Programmfluss das erste Mal auf das Schleifenkonstrukt trifft.

Die zweite Anweisung (Bedingung) wird ausgeführt, bevor der Programmfluss in den Schleifenkörper springt. Wenn die Bedingung nicht zutrifft, wird der Schleifenkörper komplett übersprungen. Nach jedem Durchlauf durch den Schleifenkörper springt das Programm wieder zur Bedingung im Schleifenkopf. Es sei denn, es gibt einen return- oder break-Befehl im Schleifenkörper.

Die dritte Anweisung wird nach Ausführung des Schleifenkörpers durchgeführt. Wenn der Programmfluss nicht in den Schleifenkörper springt, da die Bedingung nicht zutrifft, wird auch die dritte Anweisung ignoriert.

Um das noch einmal zu veranschaulichen, zeige ich folgend die einzelnen Schritte für den obigen Algorithmus unter der Annahme, dass n den Wert 3 hat:

n = 3
ungeradeZahl = 1

i = 1 (Startanweisung)
i <= n => wahr (1 <= 3)
  Ausgabestring: "1, "
  ungeradeZahl = ungeradeZahl + 2 = 3
  i = i + 1 = 2
i <= n => wahr (2 <= 3)
  Ausgabestring: "3, "
  ungeradeZahl = ungeradeZahl + 2 = 5
  i = i + 1 = 3
i <= n => wahr (3 <= 3)
  Ausgabestring: "5, "
  ungeradeZahl = ungeradeZahl + 2 = 7
  i = i + 1 = 4
i <= n => unwahr

Das Endresultat auf der Konsole wäre somit dieser String:

"1, 3, 5 "

Der letzte Wert von i ist 4, die Variable ändert sich nicht noch einmal. Da sie im Schleifenkopf initialsiert wurde, ist sie nur im Schleifenkonstrukt bekannt und wird, sobald der Programmfluss das Konstrukt passiert hat, wieder aus dem Speicher gelöscht.

...zur Antwort

Für eine Überprüfung kannst du StartsWith benutzen. Wenn du den String wirklich dauerhaft kürzen möchtest, eignet sich Substring.

...zur Antwort

Ein besserer Ansatz wäre es, zunächst herauszuarbeiten, welche Anforderungen du hast. Im Anschluss könntest du verschiedene Frameworks herausgreifen (z.B. anhand des Popularitätskriteriums) und anhand eines Vergleichs (Vorteile/Nachteile) abwägen, welches Framework sich am besten für deine Ansprüche eignet.

Eine bereits erworbene Kompetenz ist dabei auch ein wesentlicher Faktor.

...zur Antwort

Zentriere nur die Box (ul), nicht den Text.

Beispiel:

<!doctype html>
<head>
  <title>Example</title>
  <style>
    .container {
      display: flex;
      justify-content: center;
    }

    .container ul {
      list-style-position: inside;
    }
  </style>
</head>
<body>
  <article class="container">
    <ul>
      <li>Text
      <li>Other text
    </ul>
  </article>
</body>
...zur Antwort

CMS:

  • muss nicht zwingend für Webseiten genutzt werden (Stichwort: Headless CMS)
  • kann flexibel angepasst / erweitert werden (sei es durch Plugins oder selbst entwickelte Module, für neue interne Funktionen oder Anbindungen externer Systeme)
  • sofern man kein Saas-CMS einsetzt, sondern selbst entscheidet, wo/wie die Webanwendung gehostet wird, kann man die Anwendung auch freier skalieren (d.h. man kann die Webanwendung darauf ausrichten, auch mehrere Nutzeranfragen innerhalb kurzer Zeit handhaben zu können)
  • kann öfter auch mehrere unabhängige Webseiten beherbergen
  • erfordert oft etwas mehr technisches Know-How und somit auch mehr Verantwortung, administrative Aufgaben (wie das Einspielen von Updates) liegen beim Nutzer
  • ist eher für mehrere Personen ausgelegt, die zeitgleich (und mit verschiedenen Rechten ausgestattet) an dem Produkt arbeiten

Baukasten:

  • geben Module vor; Nutzer sind funktional auf diese Vorgaben eingeschränkt
  • meist gibt es keine oder nur wenige Schnittstellen, über die man individuellen Code einbinden kann (z.B. für eigene Themes/Templates); das beschränkt sich dann auch nur auf die visuelle Gestaltung (HTML/CSS)
  • werden in der Regel als Standalone-Produkte oder als SaaS vertrieben, einige Anbieter liefern zusätzliche Leistungen (wie z.B. eine eigene Domain)
  • ist vor allem für (Einzel-)Nutzer mit nur wenigem technischen Know-How ausgelegt
...zur Antwort

PyQT6 Code - Zufällige Buchstaben?

Ich habe diesen Code geschrieben:

import random
import sys
from PyQt6.QtCore import Qt, QSize
from PyQt6.QtGui import QPixmap, QFont
from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton
from PyQt6.QtWidgets import (
    QApplication,
    QCheckBox,
    QComboBox,
    QDateEdit,
    QDateTimeEdit,
    QToolBar,
    QDial,
    QDoubleSpinBox,
    QFontComboBox,
    QLabel,
    QLCDNumber,
    QLineEdit,
    QMainWindow,
    QProgressBar,
    QPushButton,
    QRadioButton,
    QSlider,
    QSpinBox,
    QTimeEdit,
    QVBoxLayout,
    QWidget,
)


from PyQt6.QtWidgets import (QWidget, QLabel, QLineEdit,
        QTextEdit, QGridLayout, QApplication)


class SushiCreator(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(QSize(300, 200))
        self.setWindowTitle("Sushi Creator")
        self.setStyleSheet("background-color: lightblue;")


        self.start_button = QPushButton("Starten", self)
        self.start_button.move(105, 75)
        self.start_button.clicked.connect(self.start_clicked)
        
    def start_clicked(self):
        self.setFixedSize(QSize(1000, 1000))
        self.start_button.hide()


        letters = 'a' + 'b'+ 'c' + 'd' + 'e' + 'f' + 'g' + 'a' + 'h' + 'c'  
        random_letters = ''.join(random.choice(letters) for i in range(5))


        


        self.letters_edit = QPushButton(self)
        self.letters_edit.setText(random_letters)
        self.letters_edit.setFont(QFont("Arial", 200))
        self.letters_edit.setStyleSheet("background-color: cyan; color: black;")
        
        
     
        
    
        


if __name__ == '__main__':
    app = QApplication(sys.argv)
    sushi_creator = SushiCreator()
    sushi_creator.show()
    sys.exit(app.exec())

Es entsteht ein hellblaues Fenster mit einem "Start" Knopf. Nach Betätigung wird dieser versteckt und das Fenster groß. Leider sind keine Buchstaben zu sehen. Kann mir jemand helfen?

...zur Frage

Du machst das Widget letters_edit nicht sichtbar.

self.letters_edit.show()

Die Größe (des Widgets oder der Schrift) müsstest du anschließend anpassen, andernfalls ist der Text nicht lesbar.

Die Generation und Überweisung des Texts könntest du übrigens noch weiter verkürzen:

random_letters = "".join(random.choices("abcdefgahc", k=5))

self.letters_edit = QPushButton(random_letters, self)

und der Name des Feldes lässt zudem vermuten, dass du eigentlich ein Textfeld (QLineEdit) einfügen wolltest.

...zur Antwort

Die getNotifyServerChannel-Funktion wird wohl eine asynchrone Aktion durchführen.

Das Prinzip bei asynchronen Funktionen ist, dass das Programm nicht explizit auf deren Beendigung wartet, sondern direkt nach deren Aufruf auf dem Programmzweig weiterläuft.

Um nun die Konsolenausgabe nach Ermitteln des Ergebnisses auszuführen, gibt es verschiedene Lösungsansätze.

a) Auf die Beendigung einer asynchronen Funktion kannst du mit await warten.

Beispiel:

async function getNotifyServerChannel() {
  // do something ...
}

// invocation:
const result = await getNotifyServerChannel();
console.log(result);

b) Über die then-Methode kannst du einen Callback integrieren, der aufgerufen wird, sobald das Ergebnis ermittelt wurde.

Beispiel:

getNotifyServerChannel().then(result => console.log(result));

c) Wenn die Definition der asynchronen Funktion von dir kommt, kannst du ebenso einen zusätzlichen Parameter definieren, über den sich ein Callback einhaken lässt.

Beispiel:

async function getNotifyServerChannel(/* some parameters ... */, callback) {
  // execute some long operation ...
  callback(result);
}

// invocation:
getNotifyServerChannel(/* some arguments ... */, result => console.log(result));

Hierbei müsstest du natürlich aufpassen, dass der Callback auch wirklich zum richtigen Zeitpunkt aufgerufen wird. Wenn innerhalb der Funktion noch weitere asynchrone Aufgaben abgearbeitet werden, müsstest du auf diese ebenso erst wieder warten.

...zur Antwort

Hallo Zusammen und zwar habe ich folgendes Problem mein PHP code funktionier nicht kann mir hier jemand bitte sagen wo der Fehler liegt und wie es richtig ist?

<?php
Session_start();
// Login Daten
$_Session[email] ='Robert';
$_passwort ='test';
?>
<html>
  <head>
    <title> login</title>
    </head>
    <body>
    
    </body>
    </html>
<html>
  <head>
      
      <title></title>
      
      <link rel ="Stylesheet" type="text/css" href="Abschlussprojekt.css">
      
    </head>
    
    
  <body>
  
    <h1 align="center">Willkommen </h1>
  
  
  <h2 align="center">Logge dich hier ein!</h2>
  
    <form action="Einlogen.php 2" method="post">
    
    
    <p align="center"><strong> Bitte gebe deine Acountdaten ein: </strong> </p>
    
    <table align="center">
    <tr><td>E-Mail:</td><td><input type="text" name="email" /></td></tr>
    <tr><td>Passwort:</td><td><input type="password" name="Passwort" /></td></tr>
    <tr></tr>
    <tr></tr>
    <tr><td><input type="Submit" name="Einloggen" value="Einloggen"></td><td></td></tr>
    </table>
    
    
    <?php
    echo $_Session[email] .'<p>Passwort'.$passwort.'<br>';
    // Das Passwort wird mit der MD5 metode verschlüsselt
    echo 'Passwort verschluesselt:'.md5($passwort);
    ?>
        
    </form>
  
  </body>
  
  </html>

Der Fehler wird mir hier angezeigt

echo $_Session[email] .'<p>Passwort'.$passwort.'<br>';
...zur Frage

Dein gesamtes Dokument ist mit Fehlern durchzogen. Zusätzlich sehe ich noch andere verbesserungswürdige Punkte.

1) Bei Variablen verhält sich PHP case-sensitiv. Die superglobale Variable für Sessions heißt $_SESSION. Als Key wird ein String erwartet. Du jedoch übergibst ein undefiniertes Symbol.

Korrektur:

$_SESSION['email'] ='Robert';

2) Jedes HTML-Dokument beginnt mit einem Doctype.

<!doctype html>

Wenn der fehlt, ist das Dokument invalid.

3) In jedem HTML-Dokument gibt es nur einen html-Knoten. Du hingegen schreibst einfach zwei Knoten hintereinander weg. Um das zu berichtigen, müssten beide Knoten vereint werden. Das heißt, im einfachsten Fall löscht man einfach den ersten html-Knoten mitsamt all seiner Subknoten.

4) Das title-Element darf nicht leer sein.

5) Das align-Attribut gehört nicht zum aktuellen Standard. Es kann ziemlich einfach via CSS ersetzt werden.

<main style="text-align: center">
  <h1>Willkommen</h1>
  <!-- etc. --->
</main>

Jeglicher Text innerhalb des main-Elements wird aufgrund der Definition von text-align zentriert.

Statt einen Inline-Style zu nutzen, könntest du auch gleich eine Regel in deiner CSS-Datei ergänzen.

main { text-align: center }

6) Das action-Attribut erwartet eine valide URI. In der wären Leerzeichen entweder nicht existent oder maskiert. Ich bezweifle jedoch, dass dieser Wert überhaupt beabsichtigt war. Er sollte sicherlich so lauten:

<form action="Einloggen.php" method="post">

7) Die erste Zeile deiner Tabelle gibt zwei Spalten vor. Folgendermaßen erwartet der Browser auch in den weiteren Zeilen jeweils zwei Spalten (oder Zellen, die zwei Spalten an Platz einnehmen).

Es wäre besser, die Elemente mit einem CSS Grid anzuordnen.

HTML:

<div class="fields">
  <label for="e-mail">E-Mail:</label>
  <input id="e-mail" name="email" type="email">
  <label for="passwort">Passwort</label>
  <input id="passwort" name="passwort" type="password">
  <div class="button-container">
    <button name="einloggen">Einloggen</button>
  </div>
</div>

CSS:

.fields {
  column-gap: 5px;
  display: grid;
  grid-template-columns: 100px 200px;
  grid-template-rows: 22px 22px 1fr;
  row-gap: 10px;
}

.button-container {
  grid-column: 1 / span 2;
  padding-top: 30px;
}

Die Breiten und Abstände sind in diesem Beispiel nur beispielhaft gesetzt.

8) Auch wenn dein Code bisher nur erste kleine Ansätze in Richtung eines Loginformulars zeigt: Ziehe niemals die md5-Funktion zum Passwort-Hashing in Betracht. Sie ist nicht sicher, denn sie kann ziemlich schnell berechnet werden.

Lies mehr dazu in der PHP-Dokumentation. Auf der Beschreibungsseite der Funktion findest du eine große rote Hinweisbox, die nicht übersehbar ist.

Und hinsichtlich der Begrifflichkeiten: Die md5-Funktion ist eine Hash- und keine Verschlüsselungsfunktion. Das heißt, es gibt keinen direkten Umkehrweg (Entschlüsselung).

9) Eine Variable $passwort wurde in deinem Skript nicht definiert. Du hast im oberen PHP-Snippet lediglich eine Variable $_passwort angelegt.

10) Ein abschließender Tipp für die spätere Datenverarbeitung und generell um sicherzustellen, dass bei jedem Nutzer die Textzeichen stets richtig ausgegeben werden: Gib dem Browser explizit eine Zeichenkodierung (via meta-Tag im head-Bereich) vor. UTF-8 ist ein stabiles Format, welches bspw. auch mit Umlauten zurechtkommt.

<meta charset="utf-8">
...zur Antwort

Wie kriege ich den Response der API in mein TextViewField in Android Studio?

Hallo,

momentan sitze ich daran, eine Android App mit Android Studio zu entwickeln. Die App soll GET und POST benutzen können, um mit einer API arbeiten zu können.

Soweit funktioniert das auch alles. Meine Frage bezieht sich hier auf Folgendes:

Ich habe in der MainActivity den TextView TW_Rueckgabe. Hier soll der Response der POST-Funktion gespeichert werden, da ich den gerne in der App anzeigen lassen will.

Nun habe ich aber bereits ein paar Sachen ausprobiert, allerdings vergebens.

Nun zu meiner eigentlichen Frage:

Wie kriege ich hin, das der Response der POST-Klasse in dem TextView TW_Rueckgabe gespeichert wird?

Danke im Voraus.

MfG

MainActivity.java

final TextView[] TW_Rueckgabe = {
  findViewById(R.id.textViewRueckgabe)
};
Button sendBtn = findViewById(R.id.sendBtn);
sendBtn.setOnClickListener(v -> {
  String POST_url = "http://dphost.ddns.net:1573/cool/post.php";
  String requestData = "data=" + TW_Benutzername.getText().toString();
  POSTRequestTask test = (POSTRequestTask) new POSTRequestTask().execute(POST_url, requestData);
  TW_Rueckgabe[0].setText(test.fetching_data);
});

POSTRequestTask.Java

class POSTRequestTask extends AsyncTask<String, Void, String> {
  @Override
  protected String doInBackground(String... params) {
    String url = params[0];
    String requestData = params[1];
    String response = "";

    try {
      URL obj = new URL(url);
      HttpURLConnection con = (HttpURLConnection) obj.openConnection();

      // add request header
      con.setRequestMethod("POST");
      con.setDoOutput(true);

      // add request data
      DataOutputStream wr = new DataOutputStream(con.getOutputStream());
      wr.writeBytes(requestData);
      wr.flush();
      wr.close();

      int responseCode = con.getResponseCode();
      System.out.println("\nSending 'POST' request to URL : " + url);
      System.out.println("Response Code : " + responseCode);

      BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
      String inputLine;
      StringBuffer responseBuffer = new StringBuffer();

      while ((inputLine = in.readLine()) != null) {
        responseBuffer.append(inputLine);
      }

      in.close();
      response = responseBuffer.toString();
    }
    catch (IOException e) {
      e.printStackTrace();
    }

    return response;
  }

  @Override
  protected void onPostExecute(String result) {
    // print result
    System.out.println("\n\n\n" + result + "\n\n\n");
    fetching_data = result;
  }

  public String returnString() {
    return fetching_data;
  }
}
...zur Frage

Das Prinzip hinter asynchronen Tasks liegt darin, dass nachfolgender Code nicht explizit auf ihre Vollendung wartet, da unbestimmt ist, wann ihre Aktion überhaupt beendet werden kann. Würde der Vorgang synchron ablaufen, würde so etwas wie der Verbindungsaufbau und Datentransport mit der API den Hauptprozess blockieren, der darauf wartet, das Textfeld mit Text füllen zu können.

Stattdessen dient die onPostExecute-Methode als Callback. Sobald die Ausführung (doInBackground) beendet ist, wird sie aufgerufen. In dieser Methode solltest du also auch den Text erst in das Textfeld setzen.

Eine Referenz auf die Komponente könntest du via Konstruktor übergeben.

class PostRequestTask extends AsyncTask<String, Void, String> {
  private final TextView textView;

  public PostRequestTask(TextView view) {
    this.textView = view;
  }

  /* ... */

  @Override
  protected void onPostExecute(String result) {
    textView.setText(result);
  }
}

oder du nutzt ein Command Pattern, um einen eigenen Callback von außen zu integrieren und somit die Task-Klasse stärker von der Activity zu entkoppeln.

public interface PostExecutable {
  void execute(String result);
}

public class PostRequestTask extends AsyncTask<String, Void, String> {
  private final PostExecutable finalTask;

  public PostRequestTask(PostExecutable finalTask) {
    this.finalTask = finalTask;
  }

  /* ... */

  @Override
  protected void onPostExecute(String result) {
    finalTask.execute(result);
  }
}

// MainActivity:
var task = new PostRequestTask(new PostExecutable() {
  @Override
  public void execute(String result) {
    yourTextView.setText(result);
  }
});
task.execute();
...zur Antwort

Setze Metatags für og:title und/oder og:description im head-Bereich deines HTML-Dokuments, so wie in der Dokumentation angegeben.

PS.: Deine beiden Links haben keinen Linktext, was weder nutzer- noch suchmaschinenfreundlich ist. Er sollte entweder (neben dem Bild) ergänzt werden oder du nutzt den Wert des alt-Attributs.

...zur Antwort

Was komnmt da hin CSS?

Hallo im Moment arbeite ich an einer spaß Website für die schule und habe ein kleines Grid Problem bzw. bin ahnungslos.
Ich habe problem bei der positionierung von einem span text
Hier der Code:

<div class="teilnehmer-profile">

    <div class="item-1"><img src="ardymon.jpg" width="100" height="100"></div>

    <div class="item-2"><span class="name">Ardymon</span></div>

    <div class="item-staffel"><span class="name">Staffel:</span></div>

    <div class="item-3"><a href="https://www.youtube.com/Ardymon"> <img src="youtubeicon.jpg" width="30" height="30"> </a></div>

    <div class="item-4"><a href="https://www.twitch.tv/ardy_v2"> <img src="twitchicon.jpg" width="30" height="30"> </a></div>

</div>

So siehts bis jetzt aus:

Und so möchte ich das es aussieht:

Zu dem grid hier der CSS code:

.item-1 {

    grid-area: bild;

    box-shadow: 2px 2px 30px 6px black;

}

.item-2 {

    grid-area: name;

   

}

.item-staffel {

    grid-area: staffel;

   

}

.item-3 {

    grid-area: youtube;

   

}

.item-4 {

    grid-area: twitch;

   

}

Item-1 = Bild

item-2 = name

item-staffel = die staffel angabe

item-3 = youtube link

item-4 = twitch link

-------------------------------------------------------------------------------------------------------------------------------------

Wichtig hierbei ist das falls jemand mir einen passenden code schreibt das er bedenkt das im Rot makierten Bereich noch etwas hingeschrieben werden soll bzw. ein Bild mit link

-------------------------------------------------------------------------------------------------------------------------------------

Ps: was auch schön wäre ist ich habe bei den YouTube und Twitch Bildern immer einen Riesen abstand dazwischen machen müssen das die links erkannt werden und ich möchte eigentlich das die "icons" nebeneinander sind aber trotzdem einen link hinterlegt haben.

hierzu der css code:
.teilnehmer-profile {

         display: grid;

         grid-template-columns: 100px 140px 30px 100px;

         grid-auto-rows: minmax(80px, auto);

         grid-template-rows: 100px;

         grid-auto-rows: 100px;

         grid-auto-flow: column;

         grid-auto-columns: 200px;

         justify-content: center;

         grid-template-areas:

    "bild name staffel youtube twitch";

}      

Ich wäre demjenigen so dankbar weil er mir aus der patsche hilft

DANKE und LG Benji

...zur Frage

Du definierst du ein einzeiliges Layout, dabei gibt deine Skizze zwei Zeilen vor.

.teilnehmer-profile {
  column-gap: 10px;
  display: grid;
  grid-template-areas:
    "bild name youtube twitch"
    "bild staffel text text";
  grid-auto-rows: minmax(50px, auto);
  grid-template-columns: 120px 140px 30px 100px;
  justify-content: center;
}

Der Platzhalter text ist hierbei noch von keinem Element belegt. Nach der obigen Vorgabe besetzt er zwei Spalten.

Bei den Zellenhöhen und -breiten müsstest du noch einmal schauen, was am besten an deine Anforderungen passt.

Bedenke dabei, dass das Bild nach obiger Lösung zwei Zeilen belegt. Alternativ könnte man auch zwei Boxen (Bild, Beschreibung) in einer Flexbox ausrichten und nur auf die zweite Box ein Grid anwenden.

Da du den Schatteneffekt sicherlich nur auf dem Bild anwenden möchtest, würde das zuständige Property noch in eine passende Regel verschieben.

.item-1 img {
  box-shadow: 2px 2px 30px 6px black;
}

Den Abstand zwischen den Spalten (und somit auch den beiden Links) kann man mit Hilfe des column-gap-Properties festlegen. Der Spaltenabstand ist uniform. Wenn du einen individuellen Abstand setzen möchtest, könntest du stattdessen für die jeweiligen Boxen (item-3, item-4) einen Innenabstand definieren.

Beispiel:

.item-4 { padding-left: 10px }

Ansonsten gilt noch immer dasselbe, was ich dir schon bei deiner letzten Frage schrieb.

...zur Antwort

Zu cx_Freeze gibt es je OS ein paar Abhängigkeiten:

https://cx-freeze.readthedocs.io/en/latest/installation.html#python-requirements

Normalerweise sollten diese automatisch heruntergeladen werden, doch du kannst es ja noch einmal manuell prüfen, ob die Abhängigkeiten installiert wurden (pip show). Erst wenn alle installiert sind, probierst du die Installation erneut.

...zur Antwort

Ich würde einmal annehmen, dass du beschreiben sollst, wie eine Anwendung mit grafischer Oberfläche in BlueJ erstellt werden kann.

An der Stelle könnte man ein paar Optionen aufzählen (AWT, Swing, JavaFX, GLOOP, SuM), kurz ein paar Unterschiede aufführen und mindestens eine Option ausführlicher vorstellen (Wie erstellt man eine einfache Oberfläche? Welche Komponenten gibt es? Wie kann man auf Nutzeraktionen reagieren?).

Zudem kann es interessant sein, welche zusätzlichen Tools / Extensions es für BlueJ gibt, die die Entwicklung einer grafischen Oberfläche vereinfachen sollen. Ich würde dir dahingehend empfehlen, nach Plugins/Extensions zu recherchieren, die bspw. einen GUI Builder in BlueJ integrieren.

...zur Antwort

Ein einfaches Beispiel:

from tkinter import *

def handle_key(event):
  output.configure(text=event.char)

root = Tk()
output = Label(root)
output.place(x=10, y=20)
root.bind("<Key>", handle_key)
root.mainloop()

An das Rootelement wird ein Event Handler (handle_key) gebunden, der bei Tastendruck reagiert. Sobald er ausgelöst wird, schreibt er das zur gedrückten Taste assoziierbare Zeichen in ein Label.

...zur Antwort

Über den Visual Studio Installer kannst du verschiedene Pakete installieren:

  • Mobile development with .NET (um unter anderem Android Apps mittels C# und Xamarin zu erstellen)
  • Mobile development with C++ (um mit C++ und Android NDK mobile Apps zu entwickeln)
  • .NET Multi-Platform App UI (um mit C# und MAUI Apps zu bauen)

Alternativ könntest du auch Qt (mit C++ und QML) nutzen. Für Visual Studio gibt es dazu ein Plugin (Qt VS Tools).

...zur Antwort

Eine Variable zeigt immer nur auf einen Wert. Dieser Wert kann aber auch ein komplexes Objekt sein.

Bei Aufzählungen von Werten gleichen Typs wären Datenstrukturen wie Listen, Arrays, o.ä. passend. In Java gibt es da schon eine Menge vorimplementierter Typen (Arrays sind Bestandteil der Sprache, in der SE gibt es Typen wie ArrayList, LinkedList, HashMap, Stack, usw.).

Bei einer Koordinate hingegen würde ich eher einen speziellen, komplexen Typ wählen, um die Achsenwerte logisch deutlich voneinander zu trennen.

Du könntest die bereits vorhandene Klasse Point nutzen:

Point someCoordinate = new Point(2, 3);
System.out.printf("x: %d y: %d", someCoordinate.getX(), someCoordinate.getY());

oder du schreibst dir deinen eigenen Typ:

class Coordinate {
  private int x;
  private int y;

  public Coordinate(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int getX() {
    return x;
  }

  public int getY() {
    return y;
  }

  public void setX(int x) {
    this.x = x;
  }

  public void setY(int y) {
    this.y = y;
  }
}

// usage:
Coordinate someCoordinate = new Coordinate(2, 3);
System.out.printf("x: %d y: %d", someCoordinate.getX(), someCoordinate.getY());
...zur Antwort