Eigenes Textfeld

Degush

Aktives Mitglied
Hey,

ich möchte ein Textfeld erstellen und dafür kein Swing nutzen, sondern es selbst programmieren.
Das Problem, das ich habe, ist folgendes:
Um die Dimensionen eines Strings zu berechnen, damit ich ihn passend aufbrechen kann und Zeilenumbrüche einfügen, brauche ich bereits ein Graphics2D Objekt. Und ich weiß nicht, wie ich eins erstellen soll, wenn nicht über BufferedImage.createGraphics();
Ich möchte nämlich ein BufferedImage erstellen mit Breite des Strings und Höhe des Strings. Aber damit ich überhaupt die Größe berechnen kann, die ich im Konstruktor angeben will!, muss ich es schon haben.

MfG,
Schmalte
 
G

Gast2

Gast
Um die Dimensionen eines Strings zu berechnen, damit ich ihn passend aufbrechen kann und Zeilenumbrüche einfügen, brauche ich bereits ein Graphics2D Objekt.
Es gibt noch die Klasse FontMetrics, mit der kannst du auch die Ausmaße eines Strings berechnen.
 

Robokopp

Bekanntes Mitglied
Also ich wusste nicht wirklich wie das funktionieren soll. Buttons gehen ja noch klar,aber wie realisiert man die texteingabe?

Gesendet von meinem GT-I9100 mit Tapatalk 2
 

Luk10

Top Contributor
Ich habe das für eins meiner Programme mal gemacht. Zum Rendern habe ich RenderStrategy und "rohe" Pixeldaten verwendet. TextFelder und ScrollPanels sind meiner Meinung nach relativ Anspruchsvoll, da man auf sehr viel achten muss.

Unten ist meine Methode(n) mit der ich Strings in eine Bitmap [rohe Pixelsdaten als int[] + width und height] konvertiere:
Width und Height bestimmen die Ausmaße der Bitmap. Die Größe des Fonts richtet sich nach Height.

Um den Text wird eine variable Box aus Sprites, sowie ein Hintergrund gerendert. Tastatur und Mauseingabe ist leider zu spezifisch um das jetzt hier so einfach zu posten.

Vielleicht hiflt dir das hier aber ein bisschen:

Java:
	public static Bitmap textToBitmap(int width, int height, String text, Font font, Color color) {
		if (text.equals("")) return new Bitmap(1, height);
		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = setMaximumRenderingHints((Graphics2D) img.getGraphics());
		if (font == null) font = GopGraphicIO.getInstance().getFont(0); // Einen Default Font holen
		if (color == null) color = Color.BLACK;

		g2.setFont(font.deriveFont((float) height));
		g2.setColor(color);
		g2.drawString(text, 0, height - g2.getFontMetrics().getDescent());
		int whitespaceWidth = g2.getFontMetrics().charWidth(' ');
		g2.dispose();

		int whitespace = 0;
		for (Character c : text.toCharArray()) {
			whitespace = c == ' ' ? whitespace + 1 : 0;
		}
                // Das hier ist das fertige BufferedImage. Es wird dann nurnoch zu einer Bitmap umgewandelt.
		img = cutTextSurplus(img, whitespace * whitespaceWidth);

		return new Bitmap(img, false);
	}

	private static BufferedImage cutTextSurplus(BufferedImage img, int whitespace) {
		for (int x = img.getWidth() - 1; x >= 0; x--) {
			boolean opaque = true;
			for (int y = 0; y < img.getHeight(); y++) {
				if (img.getRGB(x, y) >>> 24 != 0) {
					opaque = false;
					break;
				}
			}
			if (!opaque) {
				// TODO: Cuts 1 Pixel to much
				// Quickfix: width + 1
				img = img.getSubimage(0, 0, x + whitespace + 1, img.getHeight());
				break;
			}
		}
		return img;
	}

	public static Graphics2D setMaximumRenderingHints(Graphics2D g2) {
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
		g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		g2.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
		g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
		g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
		return g2;

	}

Luk10
 
Zuletzt bearbeitet:
G

Gast2

Gast
Und das soll was für einen Vorteil haben?

Ja gut verwendest anstatt Swing halt awt libs.
 

Ebenius

Top Contributor
Naja du hast halt mehr Möglichkeiten was das Aussehen deines TextFeldes angeht.
Ich gehe mal nicht auf die eigentliche Frage ein: Das Aussehen und verhalten einer Swing-Komponente bestimmt immer deren UI. Das hat so ziemlich jede Freiheit. Dazu implementierst Du ein javax.swing.plaf.TextUI (from Scratch ist das kompliziert, aber oft reicht es, von javax.swing.plaf.basic.BasicTextFieldUI zu erben) und setzt es mit [c]JTextField.setUI(TextUI)[/c].

Textdarstellung ist wesentlich komplizierter als oft gedacht. Umschreib doch mal eben, was Du eigentlich erreichen möchtest. Vielleicht musst Du gar nicht so viel selbst machen wie Du denkst…

Ebenius
 

Degush

Aktives Mitglied
Die Methode von Luk gefällt mir eigentlich ganz gut.
Aber um mal konkreter zu werden: Ich habe eine eigene kleine 2D Grafik-Engine.
Mithilfe dieser Engine möchte ich eine ansprechende Benutzeroberfläche machen. Dadurch dass ich eine 2D-Engine für das GUI benutze, kann ich überall flüssige Animationen usw. einbauen.
Jetzt möchte ich ein undecorated Vollbild-JFrame programmieren, auf dem Bilder und Texte angezeigt werden, sowie eine Möglichkeit diese mit Daumen hoch oder Daumen runter zu bewerten.
Dafür brauche ich irgendeine Möglichkeit, diese Texte darzustellen.
Die Grafikengine nimmt BufferedImages, damit das Zeichnen grafikkartenbeschleunigt und schnell geht und anspruchsvollere Grafik als das Zeichen von Quadraten und Linien usw möglich ist.
Um diese Texte darzustellen, möchte ich deshalb ein kleines BufferedImage erstellen, auf dem dieser Text steht.

Dabei möchte ich allerdings, dass man von dem Textfeld nur eine Breite angibt, keine Höhe. Die Höhe des BufferedImages soll dann automatisch berechnet werden und bevor ein Wort die Pixelbreite sprengt, wird es in die nächste Zeile geschrieben.

In dieses Textfeld soll man nicht schreiben können. In gewisser Weise ist es ein mehrzeiliges JLabel. Aber selbst wenn man was schreiben können sollte: Meine Engine feuert ein Event, wenn eine Komponente angeklickt wird.

Java:
public CarbonixTextfield(int width, String text, Font font, Color color)
    {
        Graphics2D g2d = new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB).createGraphics();
        g2d.setFont(font);
        
        FontMetrics fm = g2d.getFontMetrics();
        String[] tokens = text.split(" ");
.........

        MengineImage img = new MengineImage(width, height);
        g2d = img.createGraphics();
        
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                         RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setColor(color);
        g2d.setFont(font);
        
        for(int i = 0; i < lines.size(); i++)
        {
            System.out.println(lines.get(i));
            System.out.println(fm.getStringBounds(lines.get(i), g2d).getWidth()+"");
            g2d.drawString(lines.get(i), 0, (int)(i*30) );
        }

Dieser Ansatz von mir ist nicht besonders schön.

Wichtig ist also die Mehrzeiligkeit
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H LayoutManager RPG Programmieren, eigenes Spielfeld grafisch generieren aus Tileset AWT, Swing, JavaFX & SWT 18
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
L JavaFX als eigenes Objekt AWT, Swing, JavaFX & SWT 3
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
E Eigenes TableModel für ArrayList<String[]> AWT, Swing, JavaFX & SWT 5
N LookAndFeel Wie kann ich mein eigenes LookAndFeel machen? AWT, Swing, JavaFX & SWT 6
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
J Eigenes Gui/ Look and Feel AWT, Swing, JavaFX & SWT 14
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
C Eigenes Hintergrundbild einfügen AWT, Swing, JavaFX & SWT 6
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
P Eigenes Textverarbeitungsprogramm AWT, Swing, JavaFX & SWT 4
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
Developer_X LookAndFeel Eigenes Look And Feel erstellen AWT, Swing, JavaFX & SWT 33
B SWT Eigenes Icon für CheckboxTreeViewer AWT, Swing, JavaFX & SWT 3
KrokoDiehl Swing Design-Frage: eigenes Line-Wrapping AWT, Swing, JavaFX & SWT 5
M Swing eigenes StyledDocument AWT, Swing, JavaFX & SWT 2
D eigenes Tablemodel, Zeile löschen ArrayindexOOB excp AWT, Swing, JavaFX & SWT 4
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
M Eigenes ActionEvent / Eigener Listener AWT, Swing, JavaFX & SWT 2
A JTable, eigenes TableModel und dessen Objekte AWT, Swing, JavaFX & SWT 4
G JToolbar gleich als eigenes Fenster öffnen AWT, Swing, JavaFX & SWT 2
G Eigenes ComboBoxModel AWT, Swing, JavaFX & SWT 2
M eigenes DialogFenster AWT, Swing, JavaFX & SWT 4
L Button ändert eigenes Bild und Progressbar-Value nicht AWT, Swing, JavaFX & SWT 6
J eigenes JOptionPane ? AWT, Swing, JavaFX & SWT 2
D Eigenes Tooltip AWT, Swing, JavaFX & SWT 5
G eigenes option pane AWT, Swing, JavaFX & SWT 5
C Eigenes Event AWT, Swing, JavaFX & SWT 8
S Eigenes Package für die GUI? AWT, Swing, JavaFX & SWT 6
P Eigenes Look&Feel schreiben (Tutorials?) AWT, Swing, JavaFX & SWT 6
B Eigenes Events AWT, Swing, JavaFX & SWT 3
G für showInputDialog kein eigenes Icon auswählen AWT, Swing, JavaFX & SWT 6
M JDialog und eigenes Icon AWT, Swing, JavaFX & SWT 10
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
B Scene Builder Textfeld Begrenzen AWT, Swing, JavaFX & SWT 3
T JavaFX MultiLine / MultiStyle Textfeld AWT, Swing, JavaFX & SWT 1
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
J SWT Textfeld markieren und kopieren AWT, Swing, JavaFX & SWT 0
A Swing nur Zahlen im Spinner(Textfeld) eingeben ! AWT, Swing, JavaFX & SWT 16
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
karlmasutra JavaFX Verzeichnispfad wählen und an Textfeld übergeben AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
cool_brivk24 Großes Textfeld AWT, Swing, JavaFX & SWT 8
J Textfeld nicht sichtbar AWT, Swing, JavaFX & SWT 2
P Knopf gedrückt -> Textfeld befüllen AWT, Swing, JavaFX & SWT 9
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
T [Neuling] Textfeld Inhalt überprüfen und falsche Stellen als msg Ausgeben AWT, Swing, JavaFX & SWT 1
V Swing Eingabe aus Textfeld abholen AWT, Swing, JavaFX & SWT 6
K Swing Textfeld verstecken aber benutzen AWT, Swing, JavaFX & SWT 15
J Swing Strings werden nicht in Textfeld geschrieben AWT, Swing, JavaFX & SWT 8
P Anfängerproblem mit Textfeld AWT, Swing, JavaFX & SWT 6
C Textfeld und Label werden nicht angezeigt (Ubuntu) AWT, Swing, JavaFX & SWT 2
F Textfeld Währungszahlen und automatische Aktualisierung AWT, Swing, JavaFX & SWT 14
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
D JavaFX Textfeld Eingabe validieren AWT, Swing, JavaFX & SWT 5
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
A Textfeld.append/.setText ohne Funktion AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
A Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen AWT, Swing, JavaFX & SWT 10
N JavaFX Textfeld nur Zahlen und nur von 5 bis 30 AWT, Swing, JavaFX & SWT 11
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
D textfeld string zu float AWT, Swing, JavaFX & SWT 5
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
C Swing Button in Textfeld (JFormattedTextField) AWT, Swing, JavaFX & SWT 7
A Textfeld nachträglich einfügen AWT, Swing, JavaFX & SWT 4
D JSlider und Textfeld AWT, Swing, JavaFX & SWT 2
E Textfeld auslesen AWT, Swing, JavaFX & SWT 2
G Swing Formatiertes Textfeld mit Trennzeichen AWT, Swing, JavaFX & SWT 2
T Swing URL übergabe aus einem Textfeld AWT, Swing, JavaFX & SWT 17
L SWT Textfeld AutoCompletion AWT, Swing, JavaFX & SWT 3
SexyPenny90 NumberFormatException Textfeld AWT, Swing, JavaFX & SWT 4
P SWT Toolbar mit nur einer Schaltfläche und einem Textfeld AWT, Swing, JavaFX & SWT 2
C Textfeld automatisch befüllen AWT, Swing, JavaFX & SWT 6
S Swing Textfeld Sonderzeichen Blockiern AWT, Swing, JavaFX & SWT 2
alex_fairytail Swing Textfeld Action wenn geschrieben wird? AWT, Swing, JavaFX & SWT 6
C SWT Textfeld mit festem und variablen Inhalt AWT, Swing, JavaFX & SWT 13
J Textfeld Rotation AWT, Swing, JavaFX & SWT 2
C Live Suche mit TextFeld AWT, Swing, JavaFX & SWT 2
maddin86 Eingabe in Textfeld 1 synchron in Textfeld 2 ausgeben AWT, Swing, JavaFX & SWT 9
R JDateChooser Datumseingabe via TextFeld wird verworfen AWT, Swing, JavaFX & SWT 8
W Daten auf Textfeld in anderer Klasse verwenden AWT, Swing, JavaFX & SWT 4
A aus einem Textfeld in double parsen AWT, Swing, JavaFX & SWT 10
A TextField: Textfeld teilweise editierbar AWT, Swing, JavaFX & SWT 2
1 Textfeld auslesen AWT, Swing, JavaFX & SWT 11
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
C SWT: Mehrere Formatter in einem Textfeld AWT, Swing, JavaFX & SWT 6
D Markierter Text in Textfeld AWT, Swing, JavaFX & SWT 3
L SWT Darstellung des Datums in Textfeld? AWT, Swing, JavaFX & SWT 2
M SWT Breite von Textfeld nur ohne Layout änderbar AWT, Swing, JavaFX & SWT 2
H Ausgabe an Textfeld JTextField AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben