Performance-Probleme

blueJisCrap

Mitglied
Hallo zusammen,
Ich hab mich mal aus Spaß drangemacht 'Conway's Game of Life' umzusetzen. Das funktioniert prinzipiell auch ganz gut, nur läuft es mit einem 1600x800-Feld bei angestrebten 60 fps absolut nicht flüssig (Dabei wird jede Zelle mit einem Pixel dargestellt).

Nun zu meiner Frage: Gibt es eine performante Möglichkeit ein sehr großes zweidimensionales boolean-Array grafisch zu repräsentieren, oder anders gesagt ca. 1,3 Mio. Pixel mit 60fps zu rendern?

Falls ich in meinen Ausführungen irgendwas wichtiges vergessen habe, weist mich bitte darauf hin.
 
G

Gast2

Gast
Ohne zu wissen wie du das bisher machst kann man nicht sagen wie es besser zu machen ist. Du solltest auf jedenfall zuerst alles auf nen BufferedImage zeichnen und das dann immer wieder auf dein JPanel malen falls du das nicht schon machst.
 

blueJisCrap

Mitglied
Dem zufolge müsste ich das BufferedImage in der Klasse Map erstellen.
Nachdem ich momentan nicht weiss wie ich das genau anstelle würde ich mich über etwas Hilfestellung freuen.

Bisher sieht die Klasse so aus:

Java:
import java.util.Random;
import java.awt.*;

public class Map{
    private boolean[][] map;
    private int width, height;
    private Random rnd;

    public Map(int x, int y){
        map = new boolean[x][y];
        width = x;
        height = y;
        rnd = new Random();
        if (Conway.RANDOMIZED){
            for(int i = 0; i < width; i++){
                for (int j = 0; j < height; j++){
                    map[i][j] = rnd.nextBoolean();
                }
            }
        }
    }

    private int getAmountOfNeighbors(int x, int y){
        int n = 0;
        if ((x < width) && (y < height) && (y >= 0) && (x >= 0)){
            for(int i =  x-1; i <= x+1; i++){
                for(int j =  y-1; j <= y+1; j++){
                    if(getState(i, j)){
                        n++;
                    }
                }
            }
        }
        return n;
    }

    private boolean getState(int x, int y){
        if ((x < width) && (y < height) && (y >= 0) && (x >= 0)){
            return map[x][y];
        }
        else if (Conway.RANDOMIZED){
            return false;
        }
        else{
            return true;
        }
    }

    private boolean getNextState(int x, int y){
        if ((x < width) && (y < height) && (y >= 0) && (x >= 0)){
            if(getState(x, y)){
                switch(getAmountOfNeighbors(x, y) - 1){
                    case 2: case 3: {return true;}
                    default: {return false;}
                }
            }
            else{
                if(getAmountOfNeighbors(x, y) == 3){
                    return true;
                }
                return false;
            }
        }
        return false;
    }

    private boolean[][] nextStep(){
        boolean[][] mapN = new boolean[width][height];
        for(int i = 0; i < width; i++){
            for (int j = 0; j < height; j++){
                mapN[i][j] = getNextState(i, j);
            }
        }
        return mapN;
    }

    public void tick(){
        map = nextStep();
    }

    public int getX(){
        return width;
    }

    public int getY(){
        return height;
    }

    public void paint(Graphics g){
        int a = Conway.SCALE;
        int b = Conway.BORDER;
        for(int i = 0; i < width; i++){
            for (int j = 0; j < height; j++){
                if(map[i][j]){
                    g.setColor(Color.GREEN);
                }
                else{
                    g.setColor(Color.DARK_GRAY);
                }
                g.fillRect(i*a + b , j*a + b, a, a);
            }
        }
    }
}

Ergänzung: Map verwendet 3 Konstanten der Klasse Conway:
  • RANDOMIZED: boolean, gibt an ob ich ein zufällig generiertes Ausgangsfeld will oder nicht
  • SCALE: int, Kantenlänge der einzelnen Quadrate für die Zellen
  • BORDER: int, Abstand vom Fensterrand
 
G

Gast2

Gast
Also zunächst mal solltest du deine Klasse umbenennen, es in der Java API schon ne Klasse mit dem Namen Map. So wies ausschaut malst du bei jedem mal das komplette Feld, das dauert natürlich immer länger je größer das Feld wird.
Ich würde das mal so probieren:

- Sobald sich an deinem Spielfeld was ändert malst du das auf nen BufferedImage (nach möglichkeit änderst du dann auch nur die Bereiche die sich ändern
- in der paintComponent Methode deines Panels malst du dann nur noch das BufferedImage, das sollte dann recht flott gehn.

Wenns dann immernoch Probleme gibt muss man mal schauen wo die Zeit verloren geht.
 

blueJisCrap

Mitglied
Das Problem mit Conway's Game of Life ist, dass ich schlecht voraussagen kann was sich ändert. Ich könnte höchstens das Ergebnis von nextStep() mit dem aktuellen Feld vergleichen.

Damit bin ich aber immer noch nicht am Ziel: Wie zeichne ich denn eigentlich in ein BufferedImage?
 

Marco13

Top Contributor
Die Zellen mit fillRect zu malen ist der Performance-Killer. Mit einem BufferedImage dürfte das um Größenordnungen schneller sein. (Da kann man, wenn man das letzte rausholen will, auch noch auf setRGB verzichten, oder, wenn's ganz crank sein soll, den Conway direkt auf dem int-Array des BufferedImages laufen lassen...)
 

blueJisCrap

Mitglied
Hm, ich verwenda zwar jetzt ein BufferedImage, schneller ist es aber immernoch nicht, sieht lediglich besser aus. Marco, könntest du mir anhand eines Beispiels erläutern wie du fillRect umgehen willst?

Threads sind in Arbeit.

Vielen Dank für die bisherigen Tips und Hinweise.
 
G

Gast2

Gast
Du kannst dir per createGraphics() ein Graphics Objekt des BufferedImage geben lassen. Darauf kannst du dann per setRGB die Farbe des Pixels setzen (Ich würde für jede Zelle einen Pixel reservieren, dann sparst du dir fillRect). Wenn setRGB immernoch zu langsam ist kannst du, wie von Marco13 schon gesagt, direkt das int[] Array manipulieren. Aber ich würde erstmal mit setRGB anfangen, das sollte eigentlich schon reichen.
 

blueJisCrap

Mitglied
Also schön, Threads sind drin, BufferedImage auch. Es läuft zwar jetzt schneller, aber noch nicht so schnell wie ich mir das vorstelle.

Wie stell ich das denn an, dass ich eine zuverlässige anzeige der FPS bekomme? Bei mir zeigt er auch bei einem Feld von 1800x900 ca. 60fps an, nur glauben kann ich das nicht so recht.

Ach, für die die es interessiert oder Verbesserungsvorschläge haben mal der gesamte Code:

Game:
Java:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Game extends JFrame
{
    public static final String prefix = "Beta";
    public static final String edition = "MT";
    public static final String version = "1.5.1";

    public static final boolean RANDOMIZED = false;
    public static final int SCALE = 1;
    public static final int BORDER = 20;
    private Level map;
    private boolean drawn;
    
    private double framerate = 60;
    private int fps;

    private Thread ticker, drawer;

    public Game(int x, int y)
    {
        super("Conway's Game of Life" + " " + edition + " " + prefix + " " + version);
        map = new Level(x, y);
        setSize(x*SCALE + 2*BORDER, y*SCALE + 4*BORDER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setBackground(Color.WHITE);
        setLocationRelativeTo(getParent());
        setResizable(false);
        ticker = new Thread()
        {
            private boolean running;

            public void run()
            {
                running = true;
                while(running)
                {
                    tick();
                }
            }

            public void quit()
            {
                running = false;
            }
        };
        drawer = new Thread()
        {
            private boolean running;

            public void run()
            {
                running = true;
                int frames = 0;
                long timeBefore = System.currentTimeMillis();
                long nanosPerTick = (long) (1000000000 / framerate);
                while(running)
                {
                    repaint();
                    frames++;
                    try
                    {
                        sleep(nanosPerTick/1000000, (int) (nanosPerTick%1000000));
                    }
                    catch(InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    if(System.currentTimeMillis() - timeBefore >= 1000)
                    {
                        timeBefore += 1000;
                        fps = frames;
                        frames = 0;
                    }
                }
            }

            public void quit()
            {
                running = false;
            }
        };
        setVisible(true);
        ticker.start();
        drawer.start();
    }

    public static void main(String[] args)
    {
        new Game(1800, 900);
    }

    public void tick()
    {
        map.tick();
    }

    public void paint(Graphics g)
    {
        g.setColor(Color.GREEN);
        g.fillRect(2*BORDER - 2, 2*BORDER - 12, 120, 14);
        g.setColor(Color.BLACK);
        g.drawString("FPS: " + fps,(int) 2*BORDER,(int) 2*BORDER);
        map.paint(g);
    }
}

Level:
Java:
import java.util.Random;
import java.awt.*;
import java.awt.image.BufferedImage;

public class Level
{
    private boolean[][] map;
    private int width, height;
    private Random rnd;
    private boolean drawn;
    private BufferedImage bImage;
    private boolean built;

    public Level(int x, int y)
    {
        map = new boolean[x][y];
        width = x;
        height = y;
        rnd = new Random();
        if (Game.RANDOMIZED)
        {
            for(int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    map[i][j] = rnd.nextBoolean();
                }
            }
        }
    }

    private int getAmountOfNeighbors(int x, int y)
    {
        int n = 0;
        if ((x < width) && (y < height) && (y >= 0) && (x >= 0))
        {
            for(int i =  x-1; i <= x+1; i++)
            {
                for(int j =  y-1; j <= y+1; j++)
                {
                    if(getState(i, j))
                    {
                        n++;
                    }
                }
            }
        }
        return n;
    }

    private boolean getState(int x, int y)
    {
        if ((x < width) && (y < height) && (y >= 0) && (x >= 0))
        {
            return map[x][y];
        }
        else if (Game.RANDOMIZED)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    private boolean getNextState(int x, int y)
    {
        if ((x < width) && (y < height) && (y >= 0) && (x >= 0))
        {
            if(getState(x, y))
            {
                switch(getAmountOfNeighbors(x, y) - 1)
                {
                    case 2: case 3: {return true;}
                    default: {return false;}
                }
            }
            else
            {
                if(getAmountOfNeighbors(x, y) == 3)
                {
                    return true;
                }
                return false;
            }
        }
        return false;
    }

    private boolean[][] nextStep()
    {
        boolean[][] mapN = new boolean[width][height];
        for(int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                mapN[i][j] = getNextState(i, j);
            }
        }
        return mapN;
    }

    public synchronized void tick()
    {
        while(built)
        {
            try
            {
                wait();
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        
        int a = Game.SCALE;
        int b = Game.BORDER;

        bImage = new BufferedImage(a*width, a*height, BufferedImage.TYPE_4BYTE_ABGR); 
        Graphics2D g2 = bImage.createGraphics();

        g2.setColor(Color.RED);
        g2.fillRect(0 , 0, width*a, height*a);
        boolean[][] mapN = nextStep();
        for(int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                if(map[i][j] != mapN[i][j])
                {
                    map[i][j] = mapN[i][j];
                }
                if(map[i][j])
                {
                    //g2.setColor(Color.BLACK);
                    //g2.fillRect(i*a, j*a, a, a);
                    
                    for(int k = 0; k < a; k++)
                    {
                        for(int n = 0; n < a; n++)
                        {
                            bImage.setRGB(i*a + k, j*a + n, 0xff000000); //black
                        }
                    }
                    
                }
            }
        }
        built = true;
        notify();
    }
    
    public static void black()
    {
        System.out.println(Integer.toHexString(Color.BLACK.getRGB()));
    }
    
    public synchronized void paint(Graphics g)
    {
        while(!built)
        {
            try
            {
                wait();
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        int b = Game.BORDER;
        g.drawImage(bImage, b, 3*b, null);
        built = false;
        notify();
    }
}

Ich könnte mir vorstellen, dass die verschachtelten Schleifen noch die Performance beeinflussen.
Auf der anderen Seite weiss ich auch nicht ob es nicht einfach daran liegen könnte, dass es ein wenig dauert bis so ein relativ großes BufferedImage angezeigt wird.
 

Marco13

Top Contributor
So einiges ist mir nicht klar .... das mit dem "Built" und dem Warten dort...?!

Sowas wie Skalierung und Rand sollte man vermutlich rausziehen. D.h. die Skalierung sollte dort immer 1 sein, und wenn nötig, kann das Bild größer gezeichnet werden (mit g.drawImage(image,x,y,w,h,null)). Naja, und noch weitere mehr oder weniger wichtige Punkte, aber...
was ist genau die Frage?
 

parabool

Bekanntes Mitglied
Eigentlich bräuchte man nur die aktiven Zellen in einer Datenstruktur zu halten
um diese dann zu durchlaufen, statt die ganze Matrix durchzugehen.
Dabei muss man auch jeweils den Status der 8 umgebenden Zellen abfragen.

Könnte zumindest Geschwindigkeitsvorteile bringen, wenn die Population rel. klein ist.

Was mir noch aufgefallen ist:

Java:
boolean[][] mapN = new boolean[width][height];

Du erzeugst bei jedem Durchlauf eine neues Array, was notwendig ist weil die neu berechnete
Population die alte nicht überschreiben darf. Weiss nicht ob das performancerelevant ist aber ich
denke schon. Vielleicht das Array als Instanzvariable ?
 

Marco13

Top Contributor
Einer der angedeuteten "wichtigen Punkte" ;) (Wobei das von den Ansprüchen abhängt...)

Man könnte zumindest zwei Arrays erstellen, und immer hin- und her schalten. Wie viel das bringt ist schwer zu sagen...
 

blueJisCrap

Mitglied
Abgesehen von der Bitte um weitere Verbesserungsvorschläge hatte ich auch nach einer zuverlässigen Möglichkeit zur FPS-Ermittlung gefragt.
EDIT: Bei 1800x900 läuft der Spaß mit herausgezogener Skalierung in der Anfangsphase mit ~16FPS, angezeigt werden 59.

Der Gedanke hinter dem "built" ist relativ simpel: Ich habe 2 Threads, die abwechselnd arbeiten.
Der eine zeichnet das Bild und wartet dann eine gewisse Zeit.Während dieser Wartezeit erstellt ('baut') der andere Thread die nächste Generation.
Und um die untereinander zu synchronisieren hab ich diese Variable built, die angibt ob die nächste Generation schon fertig ist.
Das war in meinen Augen die sinnvollste Umsetzung mehrerer Threads (sollte ich damit falsch liegen korrigiert mich bitte).

parabool hat gesagt.:
Eigentlich bräuchte man nur die aktiven Zellen in einer Datenstruktur zu halten
um diese dann zu durchlaufen, statt die ganze Matrix durchzugehen.
Dabei muss man auch jeweils den Status der 8 umgebenden Zellen abfragen.
Das wäre auch eine Idee, allerdings könnte es kontraproduktiv sein wenn die Population sehr groß ist, da viele Zellen dann mehrfach abgefragt werden.

Die Skalierung könnte ich momentan höchstens in Level.paint(g) ziehen, werde das aber mal machen (EDIT: schon erledigt).
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja, das mit dem built könnte sogar Sinn machen, aber wohl nicht in genau dieser Form: Wenn das Bauen jetzt z.B. SEHR lange dauert, ist (falls ich das richtig überflogen habe) der Event-Dispatch-Thread im "paint" ja blockiert... Je nachdem, was genau man erreichen will, könnte man überlegen, das Zeichnen (der Component) nochmal vom Füllen des Bildes zu entkoppeln. Sonstige Verbesserungsvorschläge... mja, das ist immer so viel, wenn man pedantisch ist ;) Das GUI sollte mit SwingUtilities.invokeLater im EDT erstellt werden, die "quit"-Methoden der Threads kann man nicht aufrufen, und wenn man es könnte, müßte "running" noch "volatile" sein, und und und...
 

parabool

Bekanntes Mitglied
Population sehr groß ist, da viele Zellen dann mehrfach abgefragt werden
Ja, habe ich mir auch schon gedacht.
Habe mal das mit den 2 Arrays (membervariable) die hin und her schalten getestet - bringt kaum mehr Geschwindigkeit.

Ansonsten läuft es eigentlich ziemlich flüssig, finde ich.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
P seltsame Performance Probleme bei 2 Guis abhängig vom Aufruf AWT, Swing, JavaFX & SWT 8
G Probleme mit Performance bei einer Tabelle AWT, Swing, JavaFX & SWT 16
D Performance Probleme Jtable AWT, Swing, JavaFX & SWT 4
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
L JavaFX ListCell Performance AWT, Swing, JavaFX & SWT 10
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
W Swing Performance bei Griderstellung verbessern AWT, Swing, JavaFX & SWT 15
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
S Swing Performance bei Verschachtelung problematisch AWT, Swing, JavaFX & SWT 0
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
O AWT Performance und Bug behebung[brauche Hilfe] AWT, Swing, JavaFX & SWT 2
T Swing Allgemeines Problem mit der Performance bei DragAndDrop AWT, Swing, JavaFX & SWT 2
T Prüfen ob 2 JLabel übereinander liegen. Performance Problem. AWT, Swing, JavaFX & SWT 5
D DefaultTableCellRenderer - Performance AWT, Swing, JavaFX & SWT 3
hdi Swing [Umfrage] Swing Performance AWT, Swing, JavaFX & SWT 27
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
Hausmeister JTable mit Bildern - Performance AWT, Swing, JavaFX & SWT 5
J JTree Performance AWT, Swing, JavaFX & SWT 2
Developer_X Swing Graphics2D translate zerstört performance AWT, Swing, JavaFX & SWT 2
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
J Performance bei mouseMoved(...) AWT, Swing, JavaFX & SWT 4
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
G Performance beim Zeichnen erhöhen? AWT, Swing, JavaFX & SWT 21
hdi bitte um performance ratschläge AWT, Swing, JavaFX & SWT 31
G performance fragen zu AWT, Swing AWT, Swing, JavaFX & SWT 14
T (Java 6) Thumbnails in JFileChooser - Performance steigern? AWT, Swing, JavaFX & SWT 3
hdi schlechte performance bei simplem swing AWT, Swing, JavaFX & SWT 9
M Performance SWT ??? AWT, Swing, JavaFX & SWT 8
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
P SWT: StyledText Performance steigern? AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
P SWT Performance : "Text" - Ausgabe beschleunigen ? AWT, Swing, JavaFX & SWT 21
O performance g2d.drawImage() AWT, Swing, JavaFX & SWT 17
N Performance (BufferStrategy?) AWT, Swing, JavaFX & SWT 2
F Problem mit Transparenz, MouseEvents und Performance AWT, Swing, JavaFX & SWT 3
O LookAndFeel und Performance AWT, Swing, JavaFX & SWT 7
W Performance verbessern AWT, Swing, JavaFX & SWT 2
S TableCellRenderer, Performance AWT, Swing, JavaFX & SWT 9
S Performance-Problem: JTextArea als Logging-Window AWT, Swing, JavaFX & SWT 8
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben