Möglichkeit, mit g.draw etwas vor ein JTextfield zu „zeichnen“?

Stamp1t

Mitglied
Hallo,
Ich würde gerne ein Bild importieren(einfach eine leicht transparente Fläche) und sie dann in den Vordergrund vor ein JTextfield zu bekommen, sodass etwas geschriebenes dann durch diese transparente Fläche markiert ist.
Wenn ich das ganz normal programmiere, dann ist immer das JTextfield im Vordergrund und überdeckt die Fläche.
 

Robert Zenz

Top Contributor
Das ist...kompliziert. Das Aussehen und Verhalten von Swing wird von so einem genannten "Look and Feel" gesteuert, kurz, Swing hat Themes! Je nachdem welches LaF verwendet wird, kannst du bestimmte Dinge machen oder auch nicht. So als Beispiele gibt es das LaF fuer Windows, GTK oder da Metallic LaF welches das Standard-Blaeuliche ist. Dann gibt es da noch andere, zum Beispiel das WebLaF oder FlatLaf.

Sprich die genaue Position vom Text und so weiter ist vom LaF abhaengig. Das einfachste waere vermutlich wenn du dich von JTextField ableitest und dann die paint Methode, wenn ich mich richtig erinnere. Dort kannst du dann nochmal ueber das bereits gezeichnete Steuerelement darueber malen. Fuer mehr Kontrolle muesstest du dir wahrscheinlich ein eigenes Steuerelement bauen.

Was aber dein eigentliches Problem sein wird, ist das die Reihenfolge deiner Komponenten falsch sein wird, schaetze ich. Fuer alles andere muesstest du uns auch den Code zeigen mit dem du das Problem hast.
 

KonradN

Super-Moderator
Mitarbeiter
Was spricht dagegen, da einfach neben dem JTextField noch ein JPanel zu verwenden? Da kannst du dann im Vordergrund was zeichnen. Und von den Einstellungen her, kann man in Swing wohl auch ein Control so konfigurieren, dass es weder Fokus noch Mausclicks und so kriegen kann, so dass es keine Auswirkungen auf das dahinter liegende Control hat.
 

Robert Zenz

Top Contributor
Ich glaube sowas hat @Stamp1t schon, aber halt in der falschen Reihenfolge (Layouts koennen ja auch schwierig sein).

Aber stimmt, eine moegliche GlassPane habe ich aus versehen ignoriert bei meiner Erklaerung.
 

Stamp1t

Mitglied
Was spricht dagegen, da einfach neben dem JTextField noch ein JPanel zu verwenden? Da kannst du dann im Vordergrund was zeichnen. Und von den Einstellungen her, kann man in Swing wohl auch ein Control so konfigurieren, dass es weder Fokus noch Mausclicks und so kriegen kann, so dass es keine Auswirkungen auf das dahinter liegende Control hat.
Du meinst also, das importierte Bild in das JPanel zu packen und dieses dann über das Textfield zu legen?
 

KonradN

Super-Moderator
Mitarbeiter
Unter dem Strich hast Du dann ein eigene Klasse, die das macht. Also nicht nur das Bild anzeigen sondern auch noch weitere Dinge, damit es nicht selbst Events bekommt. Mausklicks sollen ja z.B. nicht von dem Control abgefangen werden sondern sollen statt dessen zum unteren JTextField.

Das sollte per setFocusable(false); und setOpace(false); möglich sein.

Ein universelles Panel für sowas könnte dann ggf. so eine Klasse sein:

Java:
import javax.swing.*;
import java.awt.*;
import java.util.function.Consumer;

public class CustomPanel extends JPanel {

    // Method reference to a method draw(Graphics)
    private Consumer<Graphics> drawMethod;

    public CustomPanel(Consumer<Graphics> drawMethod) {
        this.drawMethod = drawMethod;

        // Ensure the panel doesn't gain focus
        setFocusable(false);

        // Ensure the panel doesn't receive mouse clicks
        setOpaque(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(drawMethod != null) {
            drawMethod.accept(g);
        }
    }
}

Das kannst Du dann universell nutzen. Du brauchst nur eine Methode, die ein Graphics Objekt als Parameter nimmt und deine Grafik malt. Die kannst Du dann beim Konstruktor per Lambda Expression oder per Methodenreferenz angeben.

(Oder Du machst die individuelle Klasse und Du wirfst dem Consumer raus und packst die Logik direkt in die paintComponent Methode.)

Solltest Du hier Probleme mit der Reihenfolge haben und du Die Reihenfolge der Anzeige nicht über die Reihenfolge der add Aufrufe steuern kannst, dann kannst Du es über setComponentZOrder Aufrufe machen. Je höher der index, desto früher wird die Komponente dargestellt. Du müsstest also dem Textfeld einen höheren Index geben als dem Control, das das Bild darstellt.
 

Blender3D

Top Contributor
Hallo,
Ich würde gerne ein Bild importieren(einfach eine leicht transparente Fläche) und sie dann in den Vordergrund vor ein JTextfield zu bekommen, sodass etwas geschriebenes dann durch diese transparente Fläche markiert ist.
Meinst du in etwa so ?
1689378585173.png

Du kannst einfach paintComponent von JTextField überschreiben und eine Hilfsklasse die die Start und Endposition sowie die Farbe des markierten Textes beinhaltet machen.

Java:
import javax.swing.JFrame;

public class TestMarkedText {

    public static void main(String[] args) {
        JFrame frame = new JFrame("marked Text ");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new MarkedTextPanel());
        frame.pack();
        frame.setVisible(true);
    }

}

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

@SuppressWarnings("serial")
public class MarkedTextPanel extends JPanel {
    private MarkAbleTextField text = new MarkAbleTextField();

    public MarkedTextPanel() {
        setPreferredSize(new Dimension(200, 50));
        text.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        text.setFont(new Font("Courier", Font.BOLD, 25));
        text.setText("test1234567890");
        text.setPreferredSize(getPreferredSize());
        add(text, BorderLayout.CENTER);
        text.addTextMark( new TextMark(3, 5, Color.RED));
        text.addTextMark( new TextMark(6, 9, Color.YELLOW));
    }
}
Java:
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class MarkAbleTextField extends JTextField {
    private ArrayList<TextMark> marks = new ArrayList<>();

    public void addTextMark(TextMark mark) {
        marks.add(mark);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (TextMark m : marks)
            m.draw(g, getHeight(), getText(), getScrollOffset());
    }

    public boolean removTextMark(TextMark mark) {
        return marks.remove(mark);
    }
}
Java:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class TextMark {
    private int start;
    private int end;
    private Color color;

    public TextMark(int start, int end, Color color) {
        this.start = start;
        this.end = end;
        this.color = color;
    }

    public void draw(Graphics g, int height, String text, int scroll) {
        if (text.length() < start || text.length() < end)
            return;
        Graphics2D g2d = (Graphics2D) g;
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.45f));
        g2d.setColor(color);
        FontMetrics fm = g.getFontMetrics();
        int x = fm.stringWidth(text.substring(0, start)) - scroll + 2;
        int txtHeight = g.getFont().getSize();
        int y = (height - txtHeight) / 2;
        int width = fm.stringWidth(text.substring(start, end));
        g.fillRect(x, y, width, txtHeight);
    }
}
 

Robert Zenz

Top Contributor
Jetzt ich so darueber nachdenke, vielleicht waer eine JTextPane eine Alternative? Die unterstuetzt naemlich HTML als Text. Also du kannst dann den eingegeben Text verarbeiten, in HTML umwandeln und dann dort einfach den Bereich markieren (mit span) welchen du farblich hervorgehoben haben willst. Ist etwas mehr Logik auf der Text-Verarbeitungsseite, und braucht ein bischen mehr Feingefuehl, aber ist vielleicht etwas robuster als das selbst zu zeichnen oder Komponenten Pixel-genau auszurichten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
S Gibt es irgendeine Möglichkeit, dies zu tun?(Android Studio) Java Basics - Anfänger-Themen 1
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
G Möglichkeit zum Auslesen von Webseiten gesucht. Java Basics - Anfänger-Themen 10
H Best Practice Alternative Möglichkeit, um Eingaben vorzunehmen Java Basics - Anfänger-Themen 13
H Möglichkeit, mehrere Element zu speichern Java Basics - Anfänger-Themen 8
M Möglichkeit Einstellungen zu speichern und abzurufen Java Basics - Anfänger-Themen 7
R Sehr einfache möglichkeit ArrayList oder Array zu initialisieren? Java Basics - Anfänger-Themen 8
S 2 kurz Fragen zur Möglichkeit der Programmierung Java Basics - Anfänger-Themen 7
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
R Möglichkeit Ordnerinhalte aufzulisten Java Basics - Anfänger-Themen 15
manunana89 Bilder auf JFrame/beste Möglichkeit??? Java Basics - Anfänger-Themen 5
G Möglichkeit zum Zusammenfassen der if-Funktion Java Basics - Anfänger-Themen 5
G Gibt es eine möglichkeit den Wochentag herauszufinden? Java Basics - Anfänger-Themen 28
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
P Methoden How can I place a draw String in to the middle? Java Basics - Anfänger-Themen 1
S Wo beginnt ein Draw String zu zeichnen. Java Basics - Anfänger-Themen 4
K draw Polyline will nicht wie Polygon Java Basics - Anfänger-Themen 2
N Methode draw(Graphics g) aufrufen Java Basics - Anfänger-Themen 6
C Image draw... Java Basics - Anfänger-Themen 7
N Std.Draw Java Basics - Anfänger-Themen 8
A update/draw schleife Java Basics - Anfänger-Themen 5
M draw.Image Java Basics - Anfänger-Themen 11
M draw primitives Java Basics - Anfänger-Themen 7
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
M In gleicher zeile hinter ausgabe noch etwas ausgeben Java Basics - Anfänger-Themen 1
B Wie kann ich etwas vor der Main-Methode ausführen? Java Basics - Anfänger-Themen 21
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
D Etwas unsicher wie es weitergehen soll Java Basics - Anfänger-Themen 2
I In der Mitte eines Frames mit BorderLayout etwas malen Java Basics - Anfänger-Themen 7
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
A Ich habe das Gefühl etwas grundlegendes falsch zu machen Java Basics - Anfänger-Themen 6
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
F (Eclipse) Beim importieren etwas fehlerhaft bitte um Hilfe :) Java Basics - Anfänger-Themen 3
T Erste Schritte Textfeld abfragen ob etwas enthalten ist. Java Basics - Anfänger-Themen 17
O Etwas auf der Konsole ausgeben, usw. Java Basics - Anfänger-Themen 22
J Input/Output Scanner Input als etwas einsetzen Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Input/Output Prüfen wie oft etwas eingegeben wurde Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Gibt meiner Meinung etwas falsches aus. Java Basics - Anfänger-Themen 7
JavaNewbie2.0 Habe ein frage wie man etwas macht. Java Basics - Anfänger-Themen 13
O Klassen etwas Bruchrechnern Java Basics - Anfänger-Themen 5
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
M Variablen Eine etwas andere if Abfrage ! Java Basics - Anfänger-Themen 10
D Etwas speichern Java Basics - Anfänger-Themen 5
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
J Etwas dauerhaft überprüfen, wie ? Java Basics - Anfänger-Themen 8
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
B Wie kann man auf das JFrame einer anderen Klasse zugreifen, etwas hinzufügen und entfernen?? Java Basics - Anfänger-Themen 3
S Komponente sagen, sie soll etwas tun Java Basics - Anfänger-Themen 3
J Für 3 Sekunden etwas bestimmtes zeichnen Java Basics - Anfänger-Themen 8
H Etwas wie sort() / sorted() in JAVA-Collections? Java Basics - Anfänger-Themen 5
S 0 wird negativ, wenn sie mit etwas negativen multipliziert wird. Warum? Java Basics - Anfänger-Themen 4
G gegen (etwas) programmieren Java Basics - Anfänger-Themen 11
Binary.Coder Vor und nach jeder Codezeile etwas einfügen Java Basics - Anfänger-Themen 3
A Wie kann man etwas von Typ Image wieder löschen? Java Basics - Anfänger-Themen 7
G vor String etwas anhängen Java Basics - Anfänger-Themen 2
D Attributen und Methoden, etwas vergessen? Java Basics - Anfänger-Themen 6
T TCP, Empfang nur wenn wirklich etwas kommt Java Basics - Anfänger-Themen 6
F Etwas bestimmtes löschen Java Basics - Anfänger-Themen 13
N prüfe ob etwas in einer Matrix steht... Java Basics - Anfänger-Themen 14
S etwas schierige Ausgabe mit Systemout Java Basics - Anfänger-Themen 5
G Methode, die etwas hochzählt Java Basics - Anfänger-Themen 6
U etwas aufaddieren... acc. Java Basics - Anfänger-Themen 12
T Etwas an paint()-Methode übergeben? Java Basics - Anfänger-Themen 6
T RandomAccessFile - Wie schreibe ich etwas in eine txt Datei? Java Basics - Anfänger-Themen 5
G etwas is falsch? Java Basics - Anfänger-Themen 10
S Compile zu etwas Ausführbarem Java Basics - Anfänger-Themen 4
X Wie save ich etwas? Java Basics - Anfänger-Themen 6
R etwas andere for schleife Java Basics - Anfänger-Themen 2
G die etwas andere suche! Java Basics - Anfänger-Themen 22
M Über einen Button etwas zeichnen lassen Java Basics - Anfänger-Themen 5
L URL aufrufen und per get etwas übergeben Java Basics - Anfänger-Themen 6
K Einer Methode etwas zuweisen Java Basics - Anfänger-Themen 22
N aus einer file etwas auslesen. Java Basics - Anfänger-Themen 2
T Aus Klasse "B" in Klasse "A" etwas tun? Java Basics - Anfänger-Themen 8
G Programme etwas machen lassen. Java Basics - Anfänger-Themen 4
B Etwas in der konsole ausgeben ? Java Basics - Anfänger-Themen 7
G Programm soll nach bestimmter Zeit etwas tun Java Basics - Anfänger-Themen 24
B KeyListener (etwas bewegen) Java Basics - Anfänger-Themen 10
P Textdateischreiben, etwas fehlt noch bzw. 1 error kommt Java Basics - Anfänger-Themen 4
H in Textdateien etwas schreiben bzw. speichern Java Basics - Anfänger-Themen 2
D In String etwas einfügen. Java Basics - Anfänger-Themen 2
B Irgend etwas ist merkwürdig! brauche hilfe Java Basics - Anfänger-Themen 16
D Mein kleines Programm etwas schöner machen :-) Java Basics - Anfänger-Themen 13
G Gibt es so etwas wie eine Textfeldgruppe? Java Basics - Anfänger-Themen 2
R Dem Textfeld einer Internetseite etwas übergeben Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben