JTextPane - bewegungsloses Hintergrundsbild (Duplikat)

Mujahiddin

Top Contributor
(Dieses Thema ist ein Duplikat des Themas http://www.java-forum.org/java-basi...textpane-bewegungsloses-hintergrundsbild.html. Ich bitte um die Löschung des Themas, wenn Duplikate verboten sind, da ich dieses Thema hier doch passender finde.)

Guten Tag, liebe Programmierschaft.
Folgendes Anliegen möchte ich euch verkünden:
Ich habe ein JTextPane und möchte ein Image als Hintergrundsbild festlegen. Dieses soll jedoch fix sein, sich also weder bewegen noch zerren lassen. Beim Scrollen soll allerdings das gleiche Hintergrundsbild erhalten bleiben, ohne sich zu bewegen - nur der Text soll gescrollt werden, nicht aber das Bild (wichtig). Wenn das JTextPane vergrößert wird und somit das Hintergrundsbild für einen gesichteten Punkt außer Reichweite ist - sprich: das Hintergrundsbild ist kleiner als das JTextPane - dann soll ein neues Exemplar von diesem Bild angefertig werden und dort abgebildet aufzufinden sein.
Welcher Weg wäre denn der beste, um dies zu bewerkstelligen?

Eigene Gedanken vorweg:
1. Ich muss irgendwie machen, dass beim Erzeugen des Bilds nicht die Koordinate (0|0) des JTextPanes in Bezug auf den Scrollbalken-Punkt relevant ist, sondern die linke obere Ecke des Panes als Ursprung festgelegt wird. Sprich: beim Scrollen wird der Text in die Leere geschoben, in einen unsichtbaren Bereich, der einen weißen Hintergrund hat. Das Bild bewegt sich nicht. Nur wie, ist die Frage.
2. Bei jedem Neuzeichnen muss abgefragt werden, ob das Pane so groß ist / wird, dass die momentane Anzahl der Hintergrundsbilder zur Füllung des Sichtbereichs nicht genügen. Ist dies der Fall, muss ein neues Exemplar erzeugt werden und rechts bzw. unten angehängt werden.

Nummer 2 ist sehr einfach, ein Problem stellt hier lediglich Nummer 1 dar. Ich bedanke mich für eure Mithilfe. Habe ich mich nicht klar genug ausgedrückt? Dann bitte ich um Fragen.

Ein kleiner Auszug aus dem Quellcode (auch wenn er meines Erachtens nichts bringen wird):
Java:
public void paintComponent(Graphics g)
	{
	    if(backgroundImage != null)
		g.drawImage(backgroundImage, 0, 0, this); //das ist momentan der falsche Weg
	    super.paintComponent(g);
	}
Ich verbleibe mit vorzüglicher Hochachtung,
Mujahiddin
 
Hallo Mujahiddin,

versuch's mal so:

Java:
/*
 * BackgroundDemo benutzt die Klasse BackgroundPanel. Hier ist sie:
 * [url]http://www.camick.com/java/source/BackgroundPanel.java[/url]
 */
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.logging.*;
import javax.imageio.*;
import javax.swing.*;

public class BackgroundDemo extends JFrame {

    private final JTextPane textpane;

    public BackgroundDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        Image backgroundImage = null;
        try {
            backgroundImage = ImageIO.read(new URL(
                    "http://www.symbioseweb.de/illu/barf_stein.jpg"));
        } catch (final IOException ex) {
            Logger.getLogger(BackgroundDemo.class.getName()).log(Level.SEVERE, null, ex);
        }
        BackgroundPanel panel =
                new BackgroundPanel(backgroundImage, BackgroundPanel.TILED, 0.0f, 0.0f);
        setContentPane(panel);
        textpane = new JTextPane();
        textpane.setForeground(Color.red);
        panel.add(new JScrollPane(textpane));
    }

    public static void main(final String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new BackgroundDemo().setVisible(true);
            }
        });
    }
}

Gruß,
André
 
Zuletzt bearbeitet:

Zurück
Oben