Tôi đang cố gắng hiển thị chú giải công cụ trong Java có thể dài hoặc không dài đoạn. Làm cách nào để tôi có thể gói gọn các chú giải công cụ dài?
Tôi đang cố gắng hiển thị chú giải công cụ trong Java có thể dài hoặc không dài đoạn. Làm cách nào để tôi có thể gói gọn các chú giải công cụ dài?
Câu trả lời:
Nếu bạn bọc chú giải công cụ <html>
và </html>
thẻ, bạn có thể ngắt dòng bằng <br>
thẻ. Xem http://www.jguru.com/faq/view.jsp?EID=10653 để biết ví dụ và thảo luận.
Hoặc bạn có thể sử dụng lớp JMultiLineToolTip có thể tìm thấy nhiều nơi trên mạng, bao gồm https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/ view / JMultiLineToolTip.java
Văn bản chú giải công cụ bắt đầu bằng " <html>
" sẽ được coi là HTML. Tất nhiên đó có thể là HTML rất rộng.
Bạn có thể ghi đè JComponent.createTooltip để thay thế chú giải công cụ bằng thành phần của riêng bạn có thể hiển thị whatevee mà bạn thích.
Tôi biết cái này khá cũ nhưng tôi đã tìm thấy một giải pháp khá đơn giản bằng cách sử dụng mã HTML!
Chỉ cần sử dụng Đoạn văn HTML có chiều rộng cố định:
setToolTipText("<html><p width=\"500\">" +value+"</p></html>");
Sử dụng chú giải công cụ HTML và ngắt dòng của bạn theo cách thủ công (nên làm điều đó bằng công cụ tokenizer từ đơn giản với độ dài dòng cố định). Chỉ cần đảm bảo văn bản trên thanh công cụ của bạn bắt đầu bằng "<HTML>". Ngắt dòng bằng "<BR/>" hoặc "<P>". Tôi nhận ra rằng đó không phải là giải pháp sạch sẽ nhất và hỗ trợ HTML của Java rất kinh khủng, nhưng nó sẽ hoàn thành công việc.
Thí dụ:
jTextField1.setToolTipText("<html>"
+ "Line One"
+"<br>"
+ "Line 2"
+ "</html>");
Điều này có thể được cải thiện phần nào, nhưng cách tiếp cận của tôi là một chức năng trợ giúp được gọi trước khi thiết lập chú giải công cụ để chia văn bản chú giải công cụ ở độ dài đã cho, nhưng được điều chỉnh để ngắt các từ trên khoảng trống nếu có thể.
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();
}
}
Sử dụng như
jComponent.setToolTipText(MultiLineTooltips.splitToolTip(TOOLTIP));
Bạn có thể phân lớp JToolTip, là một Thành phần và ghi đè createToolTip () trên thành phần.
Đây là phiên bản mà tôi đã sử dụng trước đây, nó hoạt động tốt nếu bạn đang tải các mẹo công cụ của mình từ 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);
}
}
Và bạn sẽ sử dụng nó bằng cách gọi phương thức này, trước khi giao diện người dùng của bạn được tạo:
MultiLineToolTipUI.installUI();
Sau đó, trong các tệp thuộc tính của bạn, chỉ cần chèn các dòng mới để gói các mẹo công cụ của bạn như mong muốn.
Tôi đã tạo một lớp tiện ích tự động định dạng chuỗi theo độ dài cụ thể bằng <br>
các thẻ. Nó dựa trên lớp MultiLineToolTips được đăng bởi Paul Taylor, nhưng của anh ấy có một lỗi trong đó bỏ qua các phần của chuỗi và không thực sự giới hạn chuỗi ở một độ dài cụ thể.
Để sử dụng lớp của tôi, chỉ cần gọi phương thức splitToolTip bằng cách viết MultiLineToolTips.splitToolTip(yourString);
hoặc MultiLineToolTips.splitToolTip(yourString, maxLength);
nếu bạn muốn chia nó thành độ dài tối đa cụ thể. Điều này sẽ tạo ra các chuỗi mẹo công cụ được định dạng độc đáo.
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();
}
}