Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Java: Viele JLabels langsam

Java: Viele JLabels langsam

TeBeO09.02.0923:50
Hallo ich habe folgendes Problem. Ich habe ein Java Programm geschrieben indem man ein Bild malen kann und zwar so: Es wird ein Panel erzeugt indem 500x500 JLabels gelegt werden. Nun kann der Anwender Farben auswählen und damit die Labels, über einen Mouselistener gesteuert, welche anmalen. Mein Einziges Problem ist das das sau lange bracht die Labels zu auf den Panel zu schmeißen. Ich habe das über ein GridBagLayout gemacht. Vielleicht hat ja jemand einen Tipp für mich was ich ändern könnte vielleicht eine Idee welches Layout ich sonst verwenden könnte.
0

Kommentare

Johloemoe
Johloemoe10.02.0900:49
WAT?? Das macht ja so auch keiner!

Mach dir doch ne Subclass von JPanel, override die paint(Graphics g)-Methode und Handle, die Mouseevents auch in dem panel. Das geht viel besser! Warum denn 250.000 JLabels? Kein Wunder dass das hakt wie sau, die sind ja dafür auch nicht ausgelegt!
0
TeBeO10.02.0901:06
Ich habe aber 2 Jpanels ein dem einen des Feld im anderen die auswahl der Farben
0
TeBeO10.02.0902:23
mein letzter Kommentar sollte gestrichen werden is ja peinlich war grade ein wenig durcheinander weil ich es relativ einfach fand es mit Labels zu machen den nun habe ich das Problem wie ich die einzelne Kästchen unterscheiden kann. Ich poste vielleich mal den Code womit ich mein Raster erzeuge package info;

package info;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;

public class feld extends JPanel {
    int x;
    int y;
    int schalter = 0;

    public feld(int x1, int y1) {
        x = x1;
        y = y1;
    }

    public void paint(Graphics g)

    {
        System.out.println("hhh");
        int i = 0;
        int j = 0;
        while (i < x) {
            while (j < y) {
                g.setColor(Color.red);
                g.fillRect(i * 6, j * 6, 5, 5);
                j++;
            }
            j = 0;
            i++;
        }

    }

}

das füge ich dann in mein jframe ein. nun muss ich ja nur noch unterscheiden können auf welches quadrat geklickt wird

0
Mr. Krabs
Mr. Krabs10.02.0904:47
Japp, das machst du mit den mouseevents und fragst dann die Koordinaten ab.
„Deux Strudel!“
0
Johloemoe
Johloemoe10.02.0907:30
Ähm... ehrlich gesagt weiss ich nicht wirklich was du da in der paint Methode versuchst zu machen...

Aber bezüglich der Koordinaten:

feld.addMouseListener(someClass);

und dann in someClass:

mouseClicked(MouseEvent e) - überschreiben! Möglicherweise auch noch MouseDragged etc...
0
TeBeO10.02.0913:28
in der paint Methode male ich ein Raster welches variabel angelegt wird so das man die Anzahl der Zellen ändern kann. Ich hatte wie auch von Mr. Krabs auch vorgeschlagen das über eine Koordinaten abfrage gemacht, fande es nur unschön aber eine andere Idee habe ich auch nicht.

Vielen dank für euer Hilfe
0
Mr. Krabs
Mr. Krabs10.02.0914:48
TeBeO:
Naja, was anderes machen die Event-Klassen von Java doch auch nicht um zu checken, auf welches Element du geklickt hast... Du kannst dir dafür auch ne Klasse schreiben, aber ich würde das eben kurz und schmerzfrei mit der Koordinatenabfrage implementieren.
„Deux Strudel!“
0
kefek
kefek10.02.0915:19
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;

public class Zeichenfeld extends JPanel{
    
    private char [][] matrix;
    
    public Zeichenfeld(int laenge, int breite){
        matrix = new char[breite][laenge];
    }
    
    public void setMatrix(int x, int j, char farbe){
        matrix[x][j] = farbe;
    }
    
    public void paint(Graphics g){
        
        Color farbe;
        for(int i = 0 ; i < matrix.length ; i++){
            for(int j = 0; j < matrix[0].length ; j++){
                
                switch(matrix[i][j]){
                
                case 'g': farbe = Color.GREEN;
                    break;
                case 'r': farbe = Color.RED;
                    break;
                case 'b': farbe = Color.BLUE;
                    break;
                // usw ....
                    
                
                    
                }
g.setColor(farbe);
                g.drawRect(i*5, j*5, 5, 5);            
}
        }
    }                                                             
}

Ich würde das ganze in etwa so lösen ...
Der Mouselistener ruft dann einfach die setColor-Methode auf und gibt die geklickten Koordinaten und die gewünschte farbe weiter
„Die Ewigkeit dauert lange, besonders gegen Ende ...“
0
kefek
kefek10.02.0915:26
setColor soolte natürlichs setMatrix-Mehtode heißen
und in die swtich/case soltle man noch ne default einbauen ...
„Die Ewigkeit dauert lange, besonders gegen Ende ...“
0
Mr. Krabs
Mr. Krabs13.02.0904:53
Japp und die Farbe würde ich als Integer direkt durchschleifen, nicht als char.
„Deux Strudel!“
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.