# JTextField und drei Punkte (Ellipsis bei zu langem Text)



## ROCKSCHTAR (1. September 2010)

Moin @all

ich habe folgendes Problem:
In einer Oberfläche ist ein JTextfield eingebaut, dass eine Spaltenanzahl von 20 besitzt. Jetzt kommt in das Textfeld ein Text rein, der aber nicht ganz in das Textfeld reinpasst (der Text wird also abgeschnitten und man sieht den rest nur, wenn man mit dem Cursor nach hinten markiert). Jetzt ist es aber in manchen fällen so, dass es nicht ersichtlich ist, dass noch etwas folgt. Also war meine Idee (wie man es von anderen Programmen auch kennt), dass man, wenn der Text nicht reinpasst, am Ende drei Punkte einfügt (Bsp: Max Muster...).
So weiß man, dass noch etwas folgt und man kann dann mit der Maus nach hinten markieren.

Meine Frage wäre also: Gibt es eine Methode, die so etwas kann, oder gibt es ein Layout, dass dieses automatisch macht (bis jetzt ist auf dem ganzen Panel ein Gridbaglayout gesetzt)

Freue mich auf eure Antworten 

Gruß Rockschtar

(Ps: Wenn noch mehr Informationen nötig sind oder etwas nicht klar ist, schreibt mir bitte oder macht einen post)


----------



## Elmu (1. September 2010)

Ich wüsste jetzt zwar nicht wie man das so machen soll, aber einen Umweg wüsste ich.

Du kannst ja die Spaltenbreite ermitteln und dann definierst du für eine Spaltenbreite die länge des anzuzeigenden Strings.

Beispiel.

Spalte ist 20(mm) breit,... du lässt 5 Zeichen des Stringes anzeigen und fügst dann einen String von 3 Punkten (...) hintendran.

Bei 30(mm) lässt du 7 Zeichen des Stringes anzeigen, gefolgt von 3 Punkten.

Wenn die Zelle angewählt ist, dann lässt du nur deinen Text anzeigen.

// Warum machst du die Spalten nicht breiter, wenn es nur etwas ist?


----------



## ROCKSCHTAR (2. September 2010)

Wenn es nach mir ginge, hätt ich die Spalten auch länger gemacht... aber meine Mitarbeiter sagen, dass das dann sch***e aussieht -,-


----------



## Thomas Darimont (2. September 2010)

Hallo,

schau mal hier:

```
package de.tutorials.training.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class TextFieldEllipsis extends JFrame{
	
	public TextFieldEllipsis(){
		super("TextFieldEllipsis");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		String text = "ABCDEABCDEABCDEABCDEABCDE";
		int columns = 20;
		CustomTextField customTextField = new CustomTextField(text,columns);
		JTextField normalTextField = new JTextField(text,columns);
		add(customTextField,BorderLayout.NORTH);
		add(normalTextField,BorderLayout.SOUTH);
		pack();
		
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new TextFieldEllipsis();
	}
	
	static class CustomTextField extends JTextField{

		public CustomTextField(String text, int columns) {
			super(text, columns);
		}
		
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			drawEllipsisAtEndIfTextIsNotFullyVisible(g);
		}

		protected void drawEllipsisAtEndIfTextIsNotFullyVisible(Graphics g) {
			FontMetrics fontMetrics = g.getFontMetrics();
			boolean textIsToLong = getWidth() < fontMetrics.stringWidth(getText());
			boolean lastCharacterVisible = getCaretPosition()-1 > getText().length()-1 - getColumns(); 
			if(textIsToLong && !lastCharacterVisible){
				String ellipsis = "...";
				
				int x = (getWidth() - getInsets().right-fontMetrics.stringWidth(ellipsis));
				int y = getHeight() /2 + fontMetrics.getAscent() / 2;
				
				g.setColor(getBackground());
				g.fillRect(x, 0, getWidth()-x, getHeight());
				g.setColor(Color.RED);
				g.drawString(ellipsis, x, y);
			}
		}
	}
}
```

Gruß Tom


----------



## ROCKSCHTAR (2. September 2010)

BOAH... genau dass hab ich gesucht! Vielen Dank Thomas!


----------

