PNG-Grafiken verwenden

ToterTag

Mitglied
Ich habe 10 verschiedene PNG-Grafiken. Diese will ich nach Belieben in ein 2D-Array mit 200x200 packen. Also immer wieder die selben Grafiken. Alle Grafiken haben die selbe Größe und sind quadratisch. Dieses Array soll grafisch in einem bestimmten Bereich sichtbar sein. Natürlich will ich nicht alle 200x200 Bilder anzeigen. Gezeigt werden sollen auf einmal nur 20x20 - 30x30 Grafiken. Das ganze sollte also in ein JScrollPane.

Leider bekomme ich da überhaupt nichts auf die Reihe. Ich bringe es nicht mal fertig, eine PNG-Grafik an zeigen zu lassen. Davon, sie in einer Tabelle an zu ordnen kann noch gar nicht die Rede sein.

Vielleicht könnt ihr mir ja auf die Sprünge helfen :D
 
J

JohannisderKaeufer

Gast
Ja, was hast du denn bereits versucht?

KSKB?

Wie sieht es mit anderen Grafiktypen aus(jpg, png)?
 

slawaweis

Bekanntes Mitglied
1. Bilderreferenzen per Math.random() auf ein 200x200 Array verteilen.
2. Eigene Klasse (z.B. ImageGridPanel) von JPanel ableiten und das 200x200 Array als Parameter übergeben
3. Abhängig von der theoretischen gesamten Größe (200*image_width, 200*image_height) setPreferredSize() in ImageGridPanel setzen
4. ImageGridPanel in ein JScrollPane legen
5. paintComponent in ImageGridPanel überschreiben
6. Bei jedem Aufruf von paintComponent sich den JViewport von oben (getParent) holen und nachsehen, im welchen Ausschnitt man gerade ist. Diesen Ausschnitt dann rendern. Wenn der Parent kein JViewport ist, getBounds() verwenden.

Slawa
 

ToterTag

Mitglied
Danke, Slawaweis, aber wie binde ich ein Bild ein? Ich kenne das bis jetzt nur in einem jLabel und in den Codebeispielen, die sonst noch kursieren ist meistens nicht klar erkennbar was man denn nun wirklich braucht.
 

Landei

Top Contributor
Java:
class Bla extends JComponent {

   public void paintComponent(Graphics g) {
     ...
     //width und height sind optional
     g.drawImage(myImage, xPosition, yPosition, width, height, null); 
     ... 
   }
}
 

ToterTag

Mitglied
Ich habe jetzt 3 Klassen zum Testen:

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

public class Img extends JComponent
{
    @Override
   public void paintComponent(Graphics g)
    {
     Image file = Toolkit.getDefaultToolkit().getImage("/home/christoph/Desktop/icons/message.png");
     g.drawImage(file, 20, 20, 16, 13, null);
    }
}

Java:
import javax.swing.*;

public class Bild
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setSize(950, 600);
        Img test = new Img();
        frame.add(test);
    }

}

Java:
import javax.swing.*;

public class Bild2
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setSize(950, 600);
        JPanel panel = new JPanel();
        panel.setSize(200, 300);
        frame.add(panel);
        //panel.setVisible(true);
        Img test = new Img();
        frame.add(test);
    }

}

Die Klasse Bild lässt sich problemlos ausführen. Die Grafik, die ich anfordere wird im Frame gezeigt. Wenn ich in der Klasse Bild2 die Zeile, in der ich das JPanel zum Frame hinzu füge auskommentiere, wird die Grafik auch gezeigt. So, wie der Code aber jetzt ist, funktioniert es nicht. Wieso nicht? Ich möchte das Bild dann zum JPanel hinzu fügen. Aber wieso klappt es jetzt noch nicht einmal?
 

slawaweis

Bekanntes Mitglied
Die Klasse Bild lässt sich problemlos ausführen. Die Grafik, die ich anfordere wird im Frame gezeigt. Wenn ich in der Klasse Bild2 die Zeile, in der ich das JPanel zum Frame hinzu füge auskommentiere, wird die Grafik auch gezeigt. So, wie der Code aber jetzt ist, funktioniert es nicht. Wieso nicht? Ich möchte das Bild dann zum JPanel hinzu fügen. Aber wieso klappt es jetzt noch nicht einmal?
das hat was mit dem Layout zu tun. JFrame hat per Default das BorderLayout, welches höchstens 5 andere Komponenten aufnehmen kann. Jeder dieser Komponente muss man zusätzlichen den Ort im BorderLayout mitgeben, was CENTER, NORTH, SOUTH, WEST und EAST wären, Beispiel:

Java:
JFrame frame = ...;
frame.add(panel1, BorderLayout.SOUTH);
frame.add(panel2, BorderLayout.NORTH);

Fehlt der zweite Parameter in add(), wird es als BorderLayout.CENTER interpretiert. Du rufst zwei Mal add() ohne den zweiten Parameter auf. Beim ersten Mal wird das Panel als BorderLayout.CENTER hinzugefügt. Beim zweiten Mal passiert nix, weil BorderLayout.CENTER bereits besetzt ist. Du könntest es z.B. als BorderLayout.NORTH versuchen, aber visuell wäre es nicht das, was Du willst.

Slawa
 

Landei

Top Contributor
Das Layout eines JFrames lässt sich natürlich auch ändern: jFrame.getContentPane().setLayout(new FlowLayout()); oder was immer du willst.
 

ToterTag

Mitglied
Das mit Nord und Süd hat nicht geklappt. Jetzt wollte ich das eigentlich Ziel in Angriff nehmen und das Bild in das Panel hinein packen. Dazu habe ich den Code so abgeändert:
Java:
import javax.swing.*;
import java.awt.*;

public class Bild2
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new BorderLayout());
        frame.setVisible(true);
        frame.setSize(950, 600);

        Img test = new Img();
        test.setVisible(true);

        JPanel panel = new JPanel();
        panel.add(test);
        panel.setSize(200, 300);
        panel.setVisible(true);

        frame.add(panel, BorderLayout.SOUTH);
    }

}

Es wird nichts gezeigt. Nur ein leeres Fenster. Wenn ich frame.pack(); hinzu füge, macht er mir das Fenster gänzlich zu. Bedeutet das nicht idr., dass nicht mal etwas vorhanden ist? Denn wäre etwas vorhanden, wäre die kleinst mögliche Größe bestimmt nicht "kein Fenster".
 

L-ectron-X

Gesperrter Benutzer
Das Image in der Klasse
Code:
Img
sollte niemals in der
Code:
paint()
- oder
Code:
paintComponent()
-Methode geladen werden. Ein allgemeiner und besonders performancetechnischer Fauxpas.

Die Zeile 9 in
Code:
Bild2
ist in dieser Form überflüssig. Ein JFrame hat das BorderLayout bereits standardmäßig gesetzt.

Code:
setVisible(true);
sollte die letzte Anweisung auf einem JFrame sein, also erst aufrufen, wenn alle Einstellungen für den JFrame getroffen und alle anzuzeigenden Komponenten hinzugefügt wurden.
Es werden sonst u.U. nicht alle Komponenten angezeigt.

Zeile 14 sowie 18 und 19 machen erst mal keinen Sinn...

Zum Bilder laden und anzeigen kann das weiter helfen: Grafikdateien laden und anzeigen - Byte-Welt Wiki
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Grafiken zuordnen Spiele- und Multimedia-Programmierung 4
E Woher bekommt man seine Grafiken??? Spiele- und Multimedia-Programmierung 3
P Java Grafiken mit Rechnungen verknüpfen Spiele- und Multimedia-Programmierung 4
Androbin Grafiken in JAR einbinden Spiele- und Multimedia-Programmierung 3
G 3D-Objekte / Grafiken gesucht Spiele- und Multimedia-Programmierung 6
T Grafiken übereinanderlegen Spiele- und Multimedia-Programmierung 2
M Prinzipielle Frage: Kann Java Grafiken ausschneiden? Spiele- und Multimedia-Programmierung 3
V Frage zu Grafiken und Software! Spiele- und Multimedia-Programmierung 5
V Ein oder mehrere GIF-Grafiken zusammenfügen Spiele- und Multimedia-Programmierung 3
B 2D Grafiken auf Canvas3D Spiele- und Multimedia-Programmierung 7
G Grafiken mit Java im richtigen Format drucken Spiele- und Multimedia-Programmierung 3
B Pokerspiel: Problem mit Grafiken und Buttons Spiele- und Multimedia-Programmierung 3
M Abrunden der Ecken von Grafiken Spiele- und Multimedia-Programmierung 10
M Seltsames Flackern bei Laden von Grafiken Spiele- und Multimedia-Programmierung 4
K Grafiken mit Listener verbinden? Spiele- und Multimedia-Programmierung 10
G VST-Plugins in Java verwenden Spiele- und Multimedia-Programmierung 0
T MouseMotionListener aus anderer Klasse verwenden. Spiele- und Multimedia-Programmierung 1
N Buzz Controller als Buzzer verwenden Spiele- und Multimedia-Programmierung 1
H Objekt der Klasse A in der Klasse B verwenden und manipulieren Spiele- und Multimedia-Programmierung 6
T Welche OpenGL-Version soll ich verwenden? Spiele- und Multimedia-Programmierung 2
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen


Oben