Java의 여러 줄 툴팁?
자바에서 툴팁을 표시하려고 하는데, 이 툴팁은 단락 길이일 수도 있고 아닐 수도 있습니다.긴 툴팁은 어떻게 워드랩합니까?
을 " "로 "<html>
★★★★★★★★★★★★★★★★★」</html>
줄 , 줄 바꿈, 줄 바꿈, 줄 바꿈, 줄 바꿈, 줄 바꿈, 줄 바꿈.<br>
태그. 예시와 설명은 https://web.archive.org/web/20060625031340/http://www.jguru.com/faq/view.jsp?EID=10653를 참조하십시오.이 논의의 주요 요점은 다음과 같습니다.fButton.setToolTipText("<html><font face=\"sansserif\" color=\"green\">first line<br>second line</font></html>");
또는 JMultiLineToolTip 클래스를 사용할 수 있습니다.이 클래스는, https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/view/JMultiLineToolTip.java 를 포함해, 인터넷상의 많은 장소에서 찾을 수 있습니다.
"로 <html>
수 ."라고 HTML은 말합니다.HTML을 사용합니다.
JComponent.create를 덮어쓸 수 있습니다.툴팁을 원하는 컴포넌트로 대체하기 위한 툴팁입니다.
이게 꽤 오래됐다는 건 알지만 HTML 코드를 사용해서 꽤 간단한 해결책을 찾았어요!
HTML 단락의 너비를 고정하여 사용합니다.
setToolTipText("<html><p width=\"500\">" +value+"</p></html>");
예:
jTextField1.setToolTipText("<html>"
+ "Line One"
+"<br>"
+ "Line 2"
+ "</html>");
HTML 툴팁을 사용하여 수동으로 행을 구분합니다(단순한 워드토키나이저로 행 길이가 정해져 있으면 됩니다).툴팁 텍스트가 "<HTML>"로 시작하는지 확인하세요."<BR/>" 또는 "<P>"로 행을 바꿉니다.이것이 가장 깨끗한 솔루션이 아니고 Java의 HTML 지원이 형편없다는 것을 알지만, 그것은 일을 해낼 수 있을 것이다.
이것은 다소 개선될 수 있지만, 나의 접근법은 툴팁을 설정하기 전에 호출된 도우미 함수였습니다. 툴팁 텍스트는 제공된 길이로 분할되지만 가능한 경우 공백에서 단어를 구분하도록 조정됩니다.
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class MultiLineTooltips
{
private static int DIALOG_TOOLTIP_MAX_SIZE = 75;
private static final int SPACE_BUFFER = 10;
public static String splitToolTip(String tip)
{
return splitToolTip(tip,DIALOG_TOOLTIP_MAX_SIZE);
}
public static String splitToolTip(String tip,int length)
{
if(tip.length()<=length + SPACE_BUFFER )
{
return tip;
}
List<String> parts = new ArrayList<>();
int maxLength = 0;
String overLong = tip.substring(0, length + SPACE_BUFFER);
int lastSpace = overLong.lastIndexOf(' ');
if(lastSpace >= length)
{
parts.add(tip.substring(0,lastSpace));
maxLength = lastSpace;
}
else
{
parts.add(tip.substring(0,length));
maxLength = length;
}
while(maxLength < tip.length())
{
if(maxLength + length < tip.length())
{
parts.add(tip.substring(maxLength, maxLength + length));
maxLength+=maxLength+length;
}
else
{
parts.add(tip.substring(maxLength));
break;
}
}
StringBuilder sb = new StringBuilder("<html>");
for(int i=0;i<parts.size() - 1;i++)
{
sb.append(parts.get(i)+"<br>");
}
sb.append(parts.get(parts.size() - 1));
sb.append(("</html>"));
return sb.toString();
}
}
사용법
jComponent.setToolTipText(MultiLineTooltips.splitToolTip(TOOLTIP));
컴포넌트인JToolTip을 서브클래스하여 컴포넌트 상에서 createToolTip()을 덮어쓸 수 있습니다.
다음은 이전에 사용한 버전입니다.ResourceBundles에서 도구 힌트를 로드하는 경우 정상적으로 작동합니다.
import javax.swing.JComponent;
import javax.swing.JToolTip;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.ToolTipUI;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.regex.Pattern;
/**
* A tooltip that wraps multi-line text.
*/
public final class MultiLineToolTipUI extends ToolTipUI {
private static final int INSET = 2;
private static final Pattern LINE_SPLITTER = Pattern.compile("$", Pattern.MULTILINE);
private static final MultiLineToolTipUI SHARED_INSTANCE = new MultiLineToolTipUI();
/**
* Install the multi-line tooltip into the UI manager.
*/
public static void installUI() {
String toolTipUI = MultiLineToolTipUI.class.getName();
UIManager.put("ToolTipUI", toolTipUI);
UIManager.put(toolTipUI, MultiLineToolTipUI.class);
}
@SuppressWarnings("UnusedDeclaration")
public static ComponentUI createUI(JComponent c) {
return SHARED_INSTANCE;
}
private MultiLineToolTipUI() {}
@Override
public Dimension getMaximumSize(JComponent c) {
return getPreferredSize(c);
}
@Override
public Dimension getMinimumSize(JComponent c) {
return getPreferredSize(c);
}
@Override
public Dimension getPreferredSize(JComponent c) {
String[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText());
if (lines.length == 0) {
return new Dimension(2 * INSET, 2 * INSET);
}
FontMetrics metrics = c.getFontMetrics(c.getFont());
Graphics g = c.getGraphics();
int w = 0;
for (String line : lines) {
w = Math.max(w, (int) metrics.getStringBounds(line, g).getWidth());
}
int h = lines.length * metrics.getHeight();
return new Dimension(w + 2 * INSET, h + 2 * INSET);
}
@Override
public void installUI(JComponent c) {
LookAndFeel.installColorsAndFont(c, "ToolTip.background", "ToolTip.foreground", "ToolTip.font");
LookAndFeel.installBorder(c, "ToolTip.border");
}
@Override
public void paint(Graphics g, JComponent c) {
int w = c.getWidth(), h = c.getHeight();
g.setColor(c.getBackground());
g.fillRect(0, 0, w, h);
g.setColor(c.getForeground());
g.drawRect(0, 0, w, h);
String[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText());
if (lines.length != 0) {
FontMetrics metrics = c.getFontMetrics(c.getFont());
int height = metrics.getHeight();
int y = INSET + metrics.getAscent();
for (String line : lines) {
g.drawString(line, INSET, y);
y += height;
}
}
}
@Override
public void uninstallUI(JComponent c) {
LookAndFeel.uninstallBorder(c);
}
}
UI가 생성되기 전에 다음 메서드를 호출하여 사용합니다.
MultiLineToolTipUI.installUI();
그런 다음 속성 파일에 새 줄을 삽입하여 도구 팁을 필요에 따라 줄 바꿈합니다.
「」를 붙이기만 ,<html>
에는 ' 정도', '어느 정도', '어느 정도', '어느 정도', ' 정도'가 나올 때까지 ./*...*/
HTML 을 사용합니다.<html><pre>
자메문도 '천하태평'을 사용해야 했어요.<font size=3>
좀 점잖게 보이게 하려고요.
형식을 자동으로 특정 .<br>
태그는 Paul Taylor가 게시한 MultiLineToolTips 클래스를 기반으로 하지만 문자열의 일부를 건너뛰는 버그가 있어 문자열을 특정 길이로 제한하지 않습니다.
my class를 사용하려면 split Tool Tip 메서드를 호출하기만 하면 됩니다.MultiLineToolTips.splitToolTip(yourString);
또는MultiLineToolTips.splitToolTip(yourString, maxLength);
특정 최대 길이로 분할할 경우 선택합니다.이렇게 하면 올바르게 포맷된 툴팁 문자열이 생성됩니다.
import java.util.ArrayList;
import java.util.List;
/** A helper class to split strings into a certain length,
* formatted with html {@literal<br>} tags for multi-line tool tips.
* Based on the MultiLineToolTips class posted by
* <a href="https://stackoverflow.com/users/1480018/paul-taylor">Paul Taylor</a>
* on <a href="https://stackoverflow.com/a/13503677/9567822">Stack Overflow</a>
* @author <a href="https://stackoverflow.com/users/9567822/andrew-lemaitre?tab=profile">Andrew LeMaitre</a>
*/
public final class MultiLineToolTips {
/** Private constructor for utility class. */
private MultiLineToolTips() {
}
/** Default max length of the tool tip when split with {@link #splitToolTip(String)}. */
private static final int DIALOG_TOOLTIP_MAX_SIZE = 75;
/** A function that splits a string into sections of {@value #DIALOG_TOOLTIP_MAX_SIZE} characters or less.
* If you want the lines to be shorter or longer call {@link #splitToolTip(String, int)}.
* @param toolTip The tool tip string to be split
* @return the tool tip string with HTML formatting to break it into sections of the correct length
*/
public static String splitToolTip(final String toolTip) {
return splitToolTip(toolTip, DIALOG_TOOLTIP_MAX_SIZE);
}
/** An overloaded function that splits a tool tip string into sections of a specified length.
* @param toolTip The tool tip string to be split
* @param desiredLength The maximum length of the tool tip per line
* @return The tool tip string with HTML formatting to break it into sections of the correct length
*/
public static String splitToolTip(final String toolTip, final int desiredLength) {
if (toolTip.length() <= desiredLength) {
return toolTip;
}
List<String> parts = new ArrayList<>();
int stringPosition = 0;
while (stringPosition < toolTip.length()) {
if (stringPosition + desiredLength < toolTip.length()) {
String tipSubstring = toolTip.substring(stringPosition, stringPosition + desiredLength);
int lastSpace = tipSubstring.lastIndexOf(' ');
if (lastSpace == -1 || lastSpace == 0) {
parts.add(toolTip.substring(stringPosition, stringPosition + desiredLength));
stringPosition += desiredLength;
} else {
parts.add(toolTip.substring(stringPosition, stringPosition + lastSpace));
stringPosition += lastSpace;
}
} else {
parts.add(toolTip.substring(stringPosition));
break;
}
}
StringBuilder sb = new StringBuilder("<html>");
for (int i = 0; i < parts.size() - 1; i++) {
sb.append(parts.get(i) + "<br>");
}
sb.append(parts.get(parts.size() - 1));
sb.append(("</html>"));
return sb.toString();
}
}
언급URL : https://stackoverflow.com/questions/868651/multi-line-tooltips-in-java
'programing' 카테고리의 다른 글
WHEREIN에 SELECT결과를 사용하여 Alias. (0) | 2022.09.19 |
---|---|
Larabel에서 새로운 애플리케이션 키를 생성하는 시기 (0) | 2022.09.19 |
pip 설치에서 "X용 빌딩 휠 실패"가 의미하는 바는 무엇입니까? (0) | 2022.09.19 |
PHP 3진 연산자를 쓰는 방법 (0) | 2022.09.19 |
문자열 경로를 통해 중첩된 JavaScript 개체 및 배열 액세스 (0) | 2022.09.19 |