multi-line ToolTip

This commit is contained in:
Karl Tauber
2019-09-21 18:12:58 +02:00
parent 91f304054e
commit e004401772
5 changed files with 104 additions and 2 deletions

View File

@@ -411,7 +411,7 @@ public abstract class FlatLaf
}
}
private static List<String> split( String str, char delim ) {
public static List<String> split( String str, char delim ) {
ArrayList<String> strs = new ArrayList<>();
int delimIndex = str.indexOf( delim );
int index = 0;

View File

@@ -0,0 +1,91 @@
/*
* Copyright 2019 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JToolTip;
import javax.swing.SwingUtilities;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicToolTipUI;
import com.formdev.flatlaf.FlatLaf;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JToolTip}.
*
* @author Karl Tauber
*/
public class FlatToolTipUI
extends BasicToolTipUI
{
private static ComponentUI instance;
public static ComponentUI createUI( JComponent c ) {
if( instance == null )
instance = new FlatToolTipUI();
return instance;
}
@Override
public Dimension getPreferredSize( JComponent c ) {
if( isMultiLine( c ) ) {
FontMetrics fm = c.getFontMetrics( c.getFont() );
Insets insets = c.getInsets();
List<String> lines = FlatLaf.split( ((JToolTip)c).getTipText(), '\n' );
int width = 0;
int height = fm.getHeight() * Math.max( lines.size(), 1 );
for( String line : lines )
width = Math.max( width, SwingUtilities.computeStringWidth( fm, line ) );
return new Dimension( insets.left + width + insets.right, insets.top + height + insets.bottom );
} else
return super.getPreferredSize( c );
}
@Override
public void paint( Graphics g, JComponent c ) {
if( isMultiLine( c ) ) {
FontMetrics fm = c.getFontMetrics( c.getFont() );
Insets insets = c.getInsets();
FlatUIUtils.setRenderingHints( (Graphics2D) g );
g.setColor( c.getForeground() );
List<String> lines = FlatLaf.split( ((JToolTip)c).getTipText(), '\n' );
int x = insets.left;
int y = insets.top - fm.getDescent();
int lineHeight = fm.getHeight();
for( String line : lines ) {
y += lineHeight;
g.drawString( line, x, y );
}
} else
super.paint( g, c );
}
private boolean isMultiLine( JComponent c ) {
String text = ((JToolTip)c).getTipText();
return c.getClientProperty( "html" ) == null && text != null && text.indexOf( '\n' ) >= 0;
}
}

View File

@@ -50,7 +50,7 @@ TextPaneUI=com.formdev.flatlaf.ui.FlatTextPaneUI
ToggleButtonUI=com.formdev.flatlaf.ui.FlatToggleButtonUI
ToolBarUI=com.formdev.flatlaf.ui.FlatToolBarUI
ToolBarSeparatorUI=com.formdev.flatlaf.ui.FlatToolBarSeparatorUI
ToolTipUI=javax.swing.plaf.basic.BasicToolTipUI
ToolTipUI=com.formdev.flatlaf.ui.FlatToolTipUI
TreeUI=com.formdev.flatlaf.ui.FlatTreeUI
ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI

View File

@@ -156,6 +156,7 @@ public class FlatComponentsTest
indeterminateCheckBox = new JCheckBox();
JLabel toolTipLabel = new JLabel();
JToolTip toolTip1 = new JToolTip();
JToolTip toolTip2 = new JToolTip();
JLabel toolBarLabel = new JLabel();
JToolBar toolBar1 = new JToolBar();
JButton button4 = new JButton();
@@ -775,6 +776,10 @@ public class FlatComponentsTest
toolTip1.setTipText("Some text in tool tip.");
add(toolTip1, "cell 1 20 3 1");
//---- toolTip2 ----
toolTip2.setTipText("Tool tip with\nmultiple\nlines.");
add(toolTip2, "cell 1 20 3 1");
//---- toolBarLabel ----
toolBarLabel.setText("JToolBar:");
add(toolBarLabel, "cell 0 21");

View File

@@ -770,6 +770,12 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 20 3 1"
} )
add( new FormComponent( "javax.swing.JToolTip" ) {
name: "toolTip2"
"tipText": "Tool tip with\nmultiple\nlines."
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 20 3 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "toolBarLabel"
"text": "JToolBar:"