GlassPane über JScrollPane legen

richis-fragen

Aktives Mitglied
Guten Tag
schon wieder ich mit einer Frage:
GlassPane habe ich halbtransparent hingekriegt, aber wie lege ich das jetzt nur über das JScrollPane?

Das JScrollPane ist ein externes JAR mit vielen Methoden von mir gebastelt.
Jetzt möchte ich noch in diesem JAR ein GlassPane über das ganze JScrollPane legen, wenn aktionen länger dauern.

Wie mache ich das?
Mein GlassPane:
Java:
package rTable;

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class GlassPane extends JPanel {
    private static final long serialVersionUID = 1L;
    
    
    public GlassPane(int statusBarHeight) {
        super(new BorderLayout(0,0));
        JPanel pPan = new JPanel(new BorderLayout(0,0));
        pPan.setOpaque(true);
        add(pPan, BorderLayout.SOUTH);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        setOpaque(true);
    }

    
    @Override
    public void paint(Graphics g) {
        BufferedImage image = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);
        Graphics2D ig = (Graphics2D) image.getGraphics();
        super.paint(ig);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setComposite(AlphaComposite.SrcOver.derive(.2f));
        g2.drawImage(image,0,0,this);
        g2.dispose();
    }
}
Wenn ich in der Hauptanwendung (JFrame) mein GlassPane adde, und bei bedarf auf setVisible(true) setzte, funktioniert es auch.
Ich kann es auch auf ein JPanel in der Hauptanwendung setzen... funktioniert auch!
Nur innerhalb meines JARs über das JScrollPane zulegen funktioniert nicht (wirft auch keine Fehler).

Meine test-Klasse des externen JAR:
Code:
public class test extends JScrollPane {
   GlassPane gp;
  public test(){
            gp = new GlassPane();
            setGlassPane(gp);

       //wenn dann benötigt:
      gp.setVisible(true)

      //wenn fertig:
     gp.setVisible(false)
  }
}

Meine Idee ist es, dass ich nicht in der Hauptanwendung das GlassPane händeln muss sondern, dass das in meinem JAR passiert. Dieses erkennt die Recourcen intensiven Methoden.

Vielen Dank.
 

richis-fragen

Aktives Mitglied
Ich glaube ich habs rausgefunden... nur Objekte die ein ContentPane() besitzen, können ein Glass annehemen.
Ist das korrekt? Und welche Objekte ausser JFrame und JDialog besitzen ein solches?
Gibt es da noch mehr?

Vielen Dank
Richi
 

mihe7

Top Contributor

Blender3D

Top Contributor
Das JScrollPane ist ein externes JAR mit vielen Methoden von mir gebastelt.
Jetzt möchte ich noch in diesem JAR ein GlassPane über das ganze JScrollPane legen, wenn aktionen länger dauern.

Wie mache ich das?
1709757925170.png
Hier eine Lösung mit der abstrakten Klasse GlassPanel.
Die Butten sub und add verändern den Alfa Wert der Glasspane.
Auf der Glasspane zeichnet man mittels der überladenen Methode
Java:
/**
     * Draw everything that is on the glass.
     *
     * @param g {@link Graphics}
     */
    protected abstract void drawGlassPane(Graphics2D g);

Java:
public class StartGlassPane {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Teste Glass Pane");
        MyGlassPanel glass = new MyGlassPanel(frame.getRootPane(), 400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(glass);
        frame.pack();
        glass.setGlassPaneOn(true);
        frame.setVisible(true);
    }
}
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestScrollPanel extends JPanel {
    public TestScrollPanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        setBackground(Color.red);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.darkGray);
        int w = getWidth();
        int h = getHeight();
        g.setColor(Color.BLUE);
        g.drawLine(0, 0, w, h);
        g.drawLine(w, 0, 0, h);
    }
}
Java:
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JRootPane;

@SuppressWarnings("serial")
public abstract class GlassPanel extends JPanel {
    private float alpha = .5f;
    private JComponent glass = new JComponent() {
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            Composite old = g2.getComposite();
            g2.setComposite(AlphaComposite.SrcOver.derive(alpha));
            drawGlassPane(g2);
            g2.setComposite(old);
        }
    };

    public GlassPanel(JRootPane root, int width, int height) {
        setSize(width, height);
        root.setGlassPane(glass);
        glass.setOpaque(false);
    }

    /**
     *
     * @param add Factor added to glass alpha value.
     */
    public void addAlpha(float add) {
        alpha += add;
        if (alpha < 0)
            alpha = 0;
        else if (alpha > 1)
            alpha = 1;
    }

    /**
     * Draw everything that is on the glass.
     *
     * @param g {@link Graphics}
     */
    protected abstract void drawGlassPane(Graphics2D g);

    /**
     * Glass pane's opacity factor.
     *
     * @return 1 --> 0% transparency 0 --> 100% transparency
     */
    public float getAlpha() {
        return alpha;
    }

    /**
     * @param glassPaneOn Switch glass on or off.
     */
    public void setGlassPaneOn(boolean ok) {
        glass.setVisible(ok);
    }

    @Override
    public void setSize(int width, int height) {
        super.setSize(width, height);
        updateSize(width, height);
    }

    @Override
    public void setSize(Dimension d) {
        super.setSize(d);
        updateSize(d.width, d.height);
    }

    /**
     * Sets glass pane's alpha.
     *
     * @param alpha 1 --> 0% transparency 0 --> 100% transparency
     * @throws IllegalArgumentException Value has to be within range [0-1].
     */
    public void setAlpha(float alpha) throws IllegalArgumentException {
        if (alpha < 0 || alpha > 1)
            throw new IllegalArgumentException("Transparency value has to be within range [0-1]!");
        this.alpha = alpha;
    }

    private void updateSize(int width, int height) {
        setPreferredSize(new Dimension());
        glass.setPreferredSize(new Dimension(width, height));
    }
}
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class MyGlassPanel extends GlassPanel {
    private JButton btnAdd = new JButton("add");
    private JButton btnSub = new JButton("sub");
    private JLabel lblAlpha = new JLabel();
    private JScrollPane scroll;

    public MyGlassPanel(JRootPane root, int width, int height) {
        super(root, width, height);
        createPanel(width, height);
    }

    private void addToAlpha(float add) {
        addAlpha(add);
        setAlphaText(getAlpha());
        repaint();
    }

    private void createPanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        add(lblAlpha);
        add(btnSub);
        add(btnAdd);
        lblAlpha.setPreferredSize(new Dimension(width / 5, 2 * btnAdd.getFont().getSize()));
        lblAlpha.setOpaque(true);
        lblAlpha.setHorizontalAlignment(JLabel.CENTER);
        btnAdd.setFocusable(false);
        btnSub.setFocusable(false);
        setFont(new Font("Courier", Font.BOLD, height / 13));
        btnAdd.addActionListener(e -> {
            addToAlpha(.05f);
        });
        btnSub.addActionListener(e -> {
            addToAlpha(-.05f);
        });
        setAlphaText(getAlpha());
        scroll = new JScrollPane(new TestScrollPanel(width, height));
        scroll.setPreferredSize(new Dimension(width / 2, height / 2));
        add(scroll);
    }

    @Override
    protected void drawGlassPane(Graphics2D g) {
        int width = getWidth();
        int height = getHeight();
        int off = width / 10;
        Rectangle rect = new Rectangle(off, off, width - 2 * off, height - 2 * off);
        g.setColor(Color.GREEN);
        g.fillRect(rect.x, rect.y, rect.width, rect.height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.darkGray);
        int w = getWidth();
        int h = getHeight();
        g.fillRect(0, 0, w, h);
        FontMetrics fm = g.getFontMetrics();
        String text = "Behind Glass!";
        g.setColor(Color.CYAN);
        g.drawString(text, (w - fm.stringWidth(text)) / 2, 3 * (h - fm.getDescent() + fm.getAscent()) / 4);
    }

    private void setAlphaText(float alpha) {
        lblAlpha.setText(String.format("Alpha: %.2f", alpha));
    }

}
 

Anhänge

  • testGlassPane.jar
    5,8 KB · Aufrufe: 0

richis-fragen

Aktives Mitglied
Super @Blender3D vielen Dank...
aber es legt, wie ich vermutet habe das Glass-Pane über die JFrame, den JDialog.
Ich habe auch, neben den Buttons noch eine Progressbar und es funktioniert einwandfrei!!!
(bei 1Mio Record macht das sogar Sinn)

Nur... ein Glass lässt sich nicht über nur einzig und allein ein JScrollPane legen! Es muss immer ein JFrame, JDialog mit eben dem "ContentPane" sein, damit das Glass angezeigt (geadded) werden kann.

OK. man kann dem Glass Dimensionen / Bounds setzten, damit es NUR über dem JScrollPane angezeigt wird.
Danke.
 

Blender3D

Top Contributor
Nur... ein Glass lässt sich nicht über nur einzig und allein ein JScrollPane legen! Es muss immer ein JFrame, JDialog mit eben dem "ContentPane" sein, damit das Glass angezeigt (geadded) werden kann.
Du kannst für deine Komponenten einen GlassPanel verwenden und ganz nach Wahl eine oder mehrere Komponenten mit einem Glas versehen.
Hier ein weiteres Beispiel.
1710113198466.png
Wenn du start drückst werden die Starttaste und der Scrollpanel 5 Sekunden lang deaktiviert und mit einem Glas versehen.
Der Text am Label wird von press Start auf working geändert.
Dazu habe ich die Klasse ComponentMarkPanel von GlasPanel abgeleitet.

Java:
import javax.swing.JFrame;

public class StartGlassPane {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Teste Glass Pane");
        MyComponentMarkPanel glass = new MyComponentMarkPanel(frame.getRootPane(), 400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(glass);
        frame.pack();
        glass.setGlassPaneOn(true);
        frame.setVisible(true);
    }
}
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.HashSet;
import javax.swing.JRootPane;

@SuppressWarnings("serial")
public class ComponentMarkPanel extends GlassPanel {
    private HashSet<Component> marked = new HashSet<>();
    private Color markColor = Color.DARK_GRAY;

    public ComponentMarkPanel(JRootPane root, int width, int height) {
        super(root, width, height);
    }

    public void addMarked(Component c) {
        marked.add(c);
    }

    @Override
    protected void drawGlassPane(Graphics2D g) {
        Color oldColor = g.getColor();
        for (Component c : marked) {
            Rectangle r = c.getBounds();
            g.setColor(markColor);
            g.fillRect(r.x+3, r.y+3, r.width-6, r.height-6);
        }
        g.setColor(oldColor);
    }

    public void removeMarked(Component c) {
        marked.remove(c);
    }

}
Java:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class MyComponentMarkPanel extends ComponentMarkPanel {
    private String[] msg = { "press Start", "working" };
    private final int START = 0;
    private final int WORKING = 1;

    private JScrollPane scroll;
    private JLabel label = createLabel(msg[0]);
    private JButton start = new JButton("start");
    protected Timer timer = new Timer(5000, e -> stopWork());

    public MyComponentMarkPanel(JRootPane root, int width, int height) {
        super(root, width, height);
        create(width, height);
        timer.start();
    }

    private void create(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        scroll = new JScrollPane(new TestScrollPanel(width, height));
        scroll.setPreferredSize(new Dimension(width / 3, 3*height/4 ));
        label.setPreferredSize(new Dimension(width / 4, 2 * getFont().getSize()));
        add(start);
        add(label);
        add(scroll);
        start.addActionListener(e -> startWork());
        start.setFocusable(false);
        setBackground(Color.GREEN.darker());
    }

    private JLabel createLabel(String txt) {
        JLabel label = new JLabel(txt);
        label.setOpaque(true);
        label.setHorizontalAlignment(JLabel.CENTER);
        return label;
    }

    private void enableScrollBars(boolean ok) {
        JScrollBar sB = scroll.getVerticalScrollBar();
        sB.setEnabled(ok);
        sB = scroll.getHorizontalScrollBar();
        sB.setEnabled(ok);
        repaint();
    }

    private void startWork() {
        addMarked(scroll);
        addMarked(start);
        start.setEnabled(false);
        enableScrollBars(false);
        label.setText(msg[WORKING]);
        timer.start();
    }

    private void stopWork() {
        removeMarked(scroll);
        removeMarked(start);
        enableScrollBars(true);
        start.setEnabled(true);
        label.setText(msg[START]);
        timer.stop();
    }
}
 

Anhänge

  • testGlassPane.jar
    8,9 KB · Aufrufe: 0
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
D Downloadfortschritt von Datei über Google Drive API v3 Java Basics - Anfänger-Themen 10
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
S Java über SSH Java Basics - Anfänger-Themen 13
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
W char über die Konsole? Java Basics - Anfänger-Themen 7
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
J Wert zurückgeben über get Methode Java Basics - Anfänger-Themen 8
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
O Java über cmd benutzen ? Java Basics - Anfänger-Themen 5
J Variablenzugriff über string Java Basics - Anfänger-Themen 18
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
B OOP-Anfänge über CMD + Editor Java Basics - Anfänger-Themen 30
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Addition von Arrays über die Parameterliste Java Basics - Anfänger-Themen 11
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
J Gefilterten Stream über die Konsole ausgeben Java Basics - Anfänger-Themen 1
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
L Iterieren über eine CSV Datei Java Basics - Anfänger-Themen 7
I GUI über Eclipse oder NetBeans Java Basics - Anfänger-Themen 23
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
O Methode über Leerzeichen Java Basics - Anfänger-Themen 13
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
G Arraynamen über eine Schleife ansprechen Java Basics - Anfänger-Themen 4
S Bild über JButton legen Java Basics - Anfänger-Themen 3
temi Druckeransteuerung über ESC-Sequenz Java Basics - Anfänger-Themen 21
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
C Erste Schritte Fehler beim *.class Aufruf über cmd.exe Java Basics - Anfänger-Themen 9
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
P Threads Prozess kann nicht über die GUI gestartet werden Java Basics - Anfänger-Themen 8
T CMD über Java-Programm aufrufen Java Basics - Anfänger-Themen 2
X Finde die Files über FTP nicht Java Basics - Anfänger-Themen 4
J Methode über Scanner aufrufen Java Basics - Anfänger-Themen 15
P Programm kann über CMD nicht ausgeführt werden Java Basics - Anfänger-Themen 2
E Frage über Speichern und Ausgabe Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
X Betriebssytem interne Consolen Commands über Java starten Java Basics - Anfänger-Themen 2
J ArrayList über verschiedene Klassen verwenden Java Basics - Anfänger-Themen 7
A .jar über Webbrowser aufrufen Java Basics - Anfänger-Themen 2
D Ausgabe über JLabel Java Basics - Anfänger-Themen 12
L Erste Schritte Arrays über eine for Schleife ansprechen. Java Basics - Anfänger-Themen 6
MiMa Datentyp Short Wert zuweisen über Methode Java Basics - Anfänger-Themen 2
K Objekt soll Anwendung über Änderungen informieren Java Basics - Anfänger-Themen 8
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
F Gewichteter Mittelwert über eine Zeitperiode Java Basics - Anfänger-Themen 3
B Schleife über einen Container Java Basics - Anfänger-Themen 7
Henri Paare Frage über Java Programmierung Java Basics - Anfänger-Themen 10
T jar von stick aus über jre auf stick starten Java Basics - Anfänger-Themen 6
L Iterieren über ArrayList Java Basics - Anfänger-Themen 1
D Java doppelte Zahlen auch über 10 in einem String entfernen Java Basics - Anfänger-Themen 2
M Panel erstellen, welches ein Control erhält. Ausgabe soll über einen Stream erfolgen. Java Basics - Anfänger-Themen 0
F Methoden aus anderer classe über nehmen Java Basics - Anfänger-Themen 10
N .propertiesdatei über Relativen Pfad einlesen lassen Java Basics - Anfänger-Themen 5
G Input/Output CSV-Datei über Java-Programm erstellen, Zeichensalat Java Basics - Anfänger-Themen 3
G Datentypen Tipps, Ratschläge erwünscht bzgl. Datentyp bestimmen über Wertebereich Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben