Grafik in JFrame einpassen

kwonilchang

Aktives Mitglied
Hallo zusammen!

Hoffe mal, es kann mir jemand weiterhelfen:

Ich möchte ein Graustufenbild in Ascii-Art umwandeln und dann in einem JFrame anzeigen lassen. Die Umwandlung lief ohne Probleme; das Ascii-Art-Bild liegt als 2d-char-Array vor.

Mein Problem ist nun die Anzeige. Das Ascii-Art-Bild wird zwar gezeichnet, aber es passt sich nicht in den vorgesehenen JFrame ein. Also, wenn ich den JFrame größer ziehe, dann sehe ich mehr vom Bild, aber nicht das ganze.

Hier der Code soweit:

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

public class TestFrame extends JFrame {
   
    private char[][] image;
    private int width;
    private int height;
   
    public TestFrame(char[][] image) {
        this.image = image;
        this.width = image[0].length;
        this.height = image.length;
    }
  
    public void paint(Graphics g) {
        super.paint(g);
       
        for(int i = 0; i < height; i++) {
            g.drawChars(this.image[i], 0, this.width, 0, i);
        }
    }
}

Und in einer anderen Klasse die Erzeugung und Anpassung des Frames:

Java:
public void testPrintingAscii(char[][] image) {
    JFrame frame =new TestFrame(image);
        frame.setTitle("Test");
        frame.setSize(300,300);
       
        //frame.setBackground(Color.WHITE);
       
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        frame.validate();
        frame.setVisible(true);
}

Wie bekomme ich es hin, dass das Ascii-Art-Bild sich auf den Frame "verkleinert"? Ist meine Herangehensweise evtl. schon falsch? Btw: wie kann der "Hintergrund" der Graphik weiß eingefärbt werden (setBackground() zeigt keine Wirkung)?

Danke schonmal!
 

Blender3D

Top Contributor
Ist meine Herangehensweise evtl. schon falsch?
Also ich bin mir nicht ganz sicher ob ich verstanden habe was Du genau machen willst.
Ich vermute an dieser Stelle einmal:
Du möchtest Zeichen z.B. so etwas ausgeben.
O
/H\
/ \

Das ist nicht wirklich einfach zu lösen, da Du jedes Zeichen an einer genauen Position ausgebeben musst.
Eine Näherung kannst Du mit einer nicht proportionalen Schriftart ( alle Zeichen sind gleich breit ) hinschreiben.
Code:
public class testASC {
    public static void main(String[] args) {
        String[] img = { " O ", "/H\\", " / \\" };       
        JFrame frame = new JFrame();
        frame.setTitle("ASCII Art");
        frame.add(new PicturePanel(img, 400, 100));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.Arrays;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class PicturePanel extends JPanel {
    private String[] image;

    public PicturePanel(String[] img, int width, int height) {
        setPreferredSize(new Dimension(width, height));
        this.image = Arrays.copyOf(img, img.length);
        int size = height / (img.length - 1) / 2; // center y
        setFont(new Font("Fixed", Font.PLAIN, size));
        setBackground(Color.BLACK);
        setForeground(Color.YELLOW);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        FontMetrics fm = g.getFontMetrics();
        int lineHeight = fm.getHeight() - fm.getDescent();
        int xPos = (getWidth() - fm.stringWidth(image[getMaxStringId()])) / 2; // center x
        for (int i = 0; i < image.length; i++) {
            g.drawString(image[i], xPos, (i + 1) * lineHeight);
        }
    }

    /**
     * Finds position of longest string in image array.
     *
     * @return int
     */
    private int getMaxStringId() {
        int idMax = 0;
        for (int i = 1; i < image.length; i++) {
            if (image[idMax].length() < image[i].length())
                idMax = i;
        }
        return idMax;
    }
}
Ich hoffe das hilft Dir. ;)


PS. Das Ableiten von JFrame ist nicht so gut. In Swing sollte man nicht paint() sondern paintComponent() überschreiben.
 

kwonilchang

Aktives Mitglied
Danke für die Hinweise! Hat mich ein großes Stück weiter gebracht :)

Das Ascii-Art-Bild, das ich ausgeben will, ist in dem Format des Originalbildes. Also z. B. habe ich ein 180x231 Pixel-Bild in ein entsprechendes 2d-char-Array umgewandelt. Jedes Pixel wird darin durch einen char repräsentiert.

Ausgehend von Deinem Code habe ich folgendes gemacht:

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

@SuppressWarnings("serial")
public class TestFrame extends JPanel {
    private char[][] image;
    private int width;
    private int height;

    public TestFrame(char[][] image, int width, int height) {
    Dimension dim = new Dimension(width,height);
    setPreferredSize(dim);

    this.image = image;
    this.width = width; 
    this.height = height; 

    setFont(new Font("Monospaced", Font.PLAIN, 2));

    setBackground(Color.WHITE);
    setForeground(Color.BLACK);
    }

    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);

    for (int i = 0; i < this.height; i++) {
        g.drawChars(image[i], 0, this.width, 0, i);
    }
    }
}

Und entsprechend:

Java:
private static void testPrintingAscii(char[][] image) {
    JFrame frame = new JFrame();
    frame.setTitle("Test");
    frame.setResizable(true);
   
    TestFrame t = new TestFrame(image, width, height);

    frame.add(t);
   
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.pack();
    frame.setVisible(true);
    }

Damit ist die Einpassung erfolgreich. Nur bei großen Bildern wird mir der untere Fensterrand nicht mehr angezeigt. Da müsste man wohl die Bildschirmgröße in die JPanelgröße miteinbeziehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
M dynamische Grafik in JFrame einbetten AWT, Swing, JavaFX & SWT 2
M Grafik in JFrame in Kombination mit Steuerelementen AWT, Swing, JavaFX & SWT 2
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
M Umwandlung in den HSV-Farbraum lässt die Grafik pixelig werden AWT, Swing, JavaFX & SWT 8
S 2D-Grafik Winkelberechnungen auf 2D Grafik AWT, Swing, JavaFX & SWT 2
E Grafik karte erkennen AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S Höhendaten in einer Grafik ausgeben AWT, Swing, JavaFX & SWT 2
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
S Grafik in einer Klassen einfügen/hinzufügen AWT, Swing, JavaFX & SWT 1
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
F AWT Grafik wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 2
J JTabbedPane Grafik unterhalb der Tabs AWT, Swing, JavaFX & SWT 3
F Grafik hängt sich auf AWT, Swing, JavaFX & SWT 20
S LookAndFeel GUI-Grafik AWT, Swing, JavaFX & SWT 5
J Verschwommene Grafik AWT, Swing, JavaFX & SWT 4
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
F Grafik mit Buttons versehen AWT, Swing, JavaFX & SWT 8
C Grafik Taschenrechner AWT, Swing, JavaFX & SWT 5
J Grafik (Kreis) schneller bewegen? AWT, Swing, JavaFX & SWT 6
Kenan89 Grafik und Text in JPanel anzeigen AWT, Swing, JavaFX & SWT 8
D Fenster mit Grafik überlappen AWT, Swing, JavaFX & SWT 3
Maxim6394 Rotation einer Grafik in swing AWT, Swing, JavaFX & SWT 13
D Swing Grafik in JPanel anzeigen. AWT, Swing, JavaFX & SWT 3
S Grafik Fehler AWT, Swing, JavaFX & SWT 15
M Swing JLabel (mit einer Grafik) aktualisieren AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Problem beim Drucken eines Grafik-Objekts AWT, Swing, JavaFX & SWT 2
Daniel_L Grafik erstellen, drin zeichnen und dann speichern AWT, Swing, JavaFX & SWT 2
D Grafik über JPanels hinweg verschieben AWT, Swing, JavaFX & SWT 2
C Grafik von main aus aufrufen AWT, Swing, JavaFX & SWT 13
O Swing Label(bzw. Grafik) verdekt von anderm Label AWT, Swing, JavaFX & SWT 2
T rekursive Grafik AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Problem mit schreiben von Text auf eine Grafik AWT, Swing, JavaFX & SWT 7
F Swing Framework gesucht (Swing, Chart, "Scheduling" Grafik) AWT, Swing, JavaFX & SWT 2
S Pacman-Grafik AWT, Swing, JavaFX & SWT 23
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
lordcarlos Dynamische und interaktive grafik AWT, Swing, JavaFX & SWT 5
D Systemmodale Grafik AWT, Swing, JavaFX & SWT 10
J Geladene Grafik in ImageIcon auf Panel fest positionern. AWT, Swing, JavaFX & SWT 8
W Grafik aktualisieren AWT, Swing, JavaFX & SWT 5
S Swing Zugriff auf Polyline in Grafik AWT, Swing, JavaFX & SWT 4
A Swing Bei größe verändern des Fensters Grafik weg AWT, Swing, JavaFX & SWT 3
C gute Grafik-Bibliotheken gesucht AWT, Swing, JavaFX & SWT 6
D JFormattedTextfield um Grafik erweitern AWT, Swing, JavaFX & SWT 15
O Grafik wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
P JPanel mit Grafik von HDD über JTree AWT, Swing, JavaFX & SWT 10
S 2D-Grafik beeinflussen durch Scrollbalken AWT, Swing, JavaFX & SWT 2
A Grafik aus MIME-kodiertem Inhalt erzeugen AWT, Swing, JavaFX & SWT 2
T (WACOM) Grafik Tablet abfragen AWT, Swing, JavaFX & SWT 3
S Button mit Grafik versehen AWT, Swing, JavaFX & SWT 5
D Grafik bearbeiten AWT, Swing, JavaFX & SWT 11
M Ich habe Werte und Brauche Grafik! AWT, Swing, JavaFX & SWT 3
M Grafik flexibel an berechneten Koordinaten positionieren AWT, Swing, JavaFX & SWT 4
G Transparente Grafik über JMF Video zeichnen AWT, Swing, JavaFX & SWT 2
I Grafik in Text umwandeln AWT, Swing, JavaFX & SWT 11
G Grafik auf mehrere Methoden/Klassen zerlegen AWT, Swing, JavaFX & SWT 2
G Grafik in Button einbinden AWT, Swing, JavaFX & SWT 3
T grafik in jpanel wird nicht neugezeichnet AWT, Swing, JavaFX & SWT 7
F Zellen über eine Grafik legen AWT, Swing, JavaFX & SWT 7
S Grafik Farbwert verändern? AWT, Swing, JavaFX & SWT 8
D Farbe einer Grafik über den Cursor abfragen AWT, Swing, JavaFX & SWT 6
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2
S Popup auf Grafik AWT, Swing, JavaFX & SWT 18
J Grafik "sichtbar" verschieben AWT, Swing, JavaFX & SWT 2
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
G Grafik erzeugen: eine Art Zustandsgraph eines Automaten AWT, Swing, JavaFX & SWT 7
P grafik in JScrollPanel AWT, Swing, JavaFX & SWT 5
D AppletCode als JAR aus JSP benutzen und als Grafik speichern AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
S Auf einem JTabbedPane eine Grafik zeichnen AWT, Swing, JavaFX & SWT 11
W Grafik in JLabel aktualisieren AWT, Swing, JavaFX & SWT 4
S Tooltip mit Grafik AWT, Swing, JavaFX & SWT 2
D Visualisierung einer Selektion in einer Grafik. AWT, Swing, JavaFX & SWT 7
P Vektor-Grafik im XML-Format speichern AWT, Swing, JavaFX & SWT 39
P Grafik auf Button AWT, Swing, JavaFX & SWT 3
E Einträge der JComboBox werden durch Grafik verdeckt AWT, Swing, JavaFX & SWT 11
L Komponente und Grafik gleichzeitig auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
T swing - grafik schrittweise ausgeben ohne repaint() AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
Paty JFrame anfänger bräuchte hilfestellung AWT, Swing, JavaFX & SWT 7
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
Mausposition relativ zu JFrame bekommen AWT, Swing, JavaFX & SWT 6
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
N CPU Belastung bei offenem JFrame auf fast 100% AWT, Swing, JavaFX & SWT 15
N Knopf ganz oben (JFrame) AWT, Swing, JavaFX & SWT 9
N JFrame löscht alles, wenn groß gemacht AWT, Swing, JavaFX & SWT 9
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
E JFrame resizing AWT, Swing, JavaFX & SWT 2
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben