Hilfe bei vers. Fonts und Zeilenlänge in eigenem Editor.

  • Themenstarter Themenstarter masterbeef
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

masterbeef

Gast
Hallo zusammen,
nachdem man mir in den anderen Threads nicht helfen konnte hab ich mal versucht das ganze selbst zu realisieren.
Mein Algorithmus zum Zeilenumbruch funzt leider nicht immer, irgendwie ist noch ein Problem vorhanden.
Weiß vielleicht jemand wieso der Zeilenumbruch oft außerhalb der Linien stattfindet?

Hier der Code:
Code:
package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainDocument;
import javax.swing.text.Segment;
import javax.swing.text.Utilities;
import javax.swing.text.WrappedPlainView;

/*
 * Editor in Höhe und Breite begrenzt 
 * erzeugt reale \n bei erreichen der Breitenbegrenzung
 * plus Prüfung auf Zeichenanzahl und Zeilenanzahl
 */
public class Main
{

	public static void main(String[] args)
	{
		int zeilenanzahl = 30;
		int breiteInPixel = 380;
		JFrame f = new JFrame("EingabeEditor");
		TextFlaeche t = new TextFlaeche(breiteInPixel, zeilenanzahl);
		t.setDocument(new TextfeldDokument(t, -1, zeilenanzahl, breiteInPixel));
		//false, weil keine echten \n erzeugt werden bei einem Umbruch in der Anzeige, ich benötige aber welche
		t.setLineWrap(false);
		f.getContentPane().add(new JScrollPane(t));
		f.setSize(new Dimension(600,600));
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		f.setLocationRelativeTo(null);
	}
}

class TextFlaeche extends JTextArea
{

	private static final long serialVersionUID = 426390513642911007L;

	private int zeilenanzahl;

	private int breiteInPixel;

	public TextFlaeche(int breiteInPixel, int zeilenanzahl)
	{
		this.breiteInPixel = breiteInPixel;
		this.zeilenanzahl = zeilenanzahl;
	}

	//für Debugging Zwecke damit man sieht ob der Editor richtig funktioniert
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.LIGHT_GRAY);
		g.drawRect(0, 0, breiteInPixel, getFontMetrics(getFont()).getHeight() * zeilenanzahl);
	}
}

class TextfeldDokument extends PlainDocument
{

	private static final long serialVersionUID = 3201870807074844558L;

	private int maxLength_ = -1; // bei -1 unendlich viele Zeichen erlaubt, nur in der Breite begrenzt

	private int zeilenanzahl = -1; // bei -1 unendlich viele Zeilen erlaubt, nur in der Breite begrenzt

	private int breiteInPixel; // Breite des Editors

	private JTextArea t;

	public TextfeldDokument(JTextArea t, final int maxLength, final int zeilenanzahl, int breiteInPixel)
	{
		this.breiteInPixel = breiteInPixel;
		this.zeilenanzahl = zeilenanzahl;
		this.maxLength_ = maxLength;
		this.t = t;
	}

	public void insertString(final int offs, final String str, final AttributeSet a) throws BadLocationException
	{
		try
		{
			
			if (str == null)
				return;
			
			//Prüfen ob eingefügt werden darf
			if (!(t.getLineCount() == zeilenanzahl && str.equals("\n")) 
					&& (zeilenanzahl == -1 || t.getLineCount() <= zeilenanzahl) 
					&& (maxLength_ == -1 || getLength() + str.length() <= maxLength_))
			{
				super.insertString(offs, str, a);
			}
			else
			{
				//beep();
			}
			
			
			System.out.println("welche Zeile momentan: " + getCaretRowPosition(t));
			System.out.println("Cursor vor welche Position in der Zeile: " + getCaretColumnPosition(t));
			System.out.println("Textlänge bis Cursor: " + getText(0, t.getCaretPosition()).replaceAll("\n", "").length());
			
			Segment s = new Segment();
			getContent().getChars(0, (t.getCaretPosition() - getCaretRowPosition(t) + 1), s);
			
			//Ausrechnen der Pixelanzahl Textes mit einem bestimmtem Font
			int v = Utilities.getTabbedTextWidth(s, t.getFontMetrics(t.getFont()), 0, new WrappedPlainView(t.getDocument().getDefaultRootElement()), 0);
			System.out.println("Pixelbreite: " + v);
			
			//ist Breitenbegrenzung erreicht, wenn ja \n dranhängen?
			if (v > getCaretRowPosition(t) * breiteInPixel)
				super.insertString(offs, "\n", a);
			
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		System.out.println();
	}

	public static int getCaretRowPosition(JTextArea comp)
	{
		try
		{
			int line = comp.getLineOfOffset(comp.getSelectionStart()) + 1;
			return line;
		} catch (BadLocationException e)
		{
		}
		return -1;
	}

	public static int getCaretColumnPosition(JTextComponent comp)
	{
		int offset = comp.getCaretPosition();
		int column;
		try
		{
			column = offset - Utilities.getRowStart(comp, offset) + 1;
		} catch (BadLocationException e)
		{
			column = -1;
		}
		return column;
	}

}
 
Ein kurzen Comment ob das ganze überhaupt so funktionieren kann wär auch hilfreich.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben