JTabbedPane mit speziellen Einstellungen

115%

Gesperrt
Hallo

Ich habe ein TabbedPane wo neue Registerkarten hinzugefügt werden. Wenn nun eine bestimmte Anzahl von Tabs hinzugefügt wurden, springt Swing eine Zeile nach oben und lagert die zusätzlichen Reiter in einer neuen Zeile aus. Das möchte und will ich aber nicht. Sie sollen desweiteren rechts angeheftet werden und wie beim Firefox soll ein Button zum Scrollen angezeigt werden. Kann ich ein einfaches ScrollPane einfügen? Außerdem möchte ich gerne das wenn der Name im Reiter zu lang ist ab einer bestimmten Länge abgeschnitten werden soll. Es soll dann nur noch Reiter1istein... angezeigt werden.

Ich würde mich über eure Hilfe sehr freuen.
 
Hi das sollte weiterhelfen:

Code:
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicTabbedPaneUI;


public class JTabbedPaneTest{
	

	private void createAndShowGUI() {

		JFrame frame = new JFrame();
		JTabbedPane tp = new JTabbedPane();
		
		
		//HIER ist das was du brauchst
		tp.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
		
		//Muss noch überarbeitet werden, Text sieht sonst nicht sauber aus
		tp.setUI(new DefaultWidth());
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new BorderLayout());
		
		for (int i = 0; i< 50; i++){
			tp.addTab("Pane Number " + String.valueOf(i), new JPanel()); 
		}
	
		frame.add(tp, BorderLayout.CENTER);
		frame.setSize(800, 600);
		frame.setVisible(true);
	}

	public JTabbedPaneTest(){
		createAndShowGUI();
	}

	
	public static void main(String[] args) {

		new JTabbedPaneTest();
	}
}
class DefaultWidth extends BasicTabbedPaneUI
{


	@Override
	protected void paintText(Graphics g, int tabPlacement, Font font,
			FontMetrics metrics, int tabIndex, String title,
			Rectangle textRect, boolean isSelected) {

		String defaultAdd = "...";
		StringBuffer tmp = new StringBuffer();
		int counter = 0;
		if (metrics.stringWidth(title) > 40){
			while (metrics.stringWidth(tmp.toString()+defaultAdd) < 40){
				tmp.append(title.charAt(counter));
				counter++;
			}
		}
		title = tmp.toString() + defaultAdd;

		super.paintText(g, tabPlacement, font, metrics, tabIndex, title, textRect,
				isSelected);
	}

	@Override
	protected int calculateTabWidth(int arg0, int arg1, FontMetrics arg2) {
		return 50;
		
	}
  
}

Ich weiß nicht ob es eine einfache Möglichkeit mit dem Text abschneiden gibt... aber das sollte funktionieren (muss natürlich noch optimiert werden)
 
Zuletzt bearbeitet:
Zurück