我需要知道JButton的文本何时被布局截断。因此,为了找出我在我们的自定义ButtonUI委托中重写以下方法:
protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) {
//the text argument will show an ellipse (...) when truncated
}
在方法内部,我检查文本参数是否以椭圆结尾。
有没有更好的方法来检查文本是否被截断?椭圆怎么样?这是截断文本的通用符号,还是我需要查找将划分截断文本的本地化符号?
我注意到OSX将使用表示椭圆的单个字符,Windows将使用三个句点。我认为这是基于使用的字体,但它让我想到了可能偷偷摸摸的其他事情。
感谢。
答案 0 :(得分:2)
如果将传递给paintText
方法的文本与((AbstractButton)c).getText()
返回的文本进行比较,会不会有效?如果不同,则文本已被截断。
最终,截断本身在SwingUtilities.layoutCompoundLabel
中完成,您可以自己调用该方法,但计算直接使用该方法所需的所有参数似乎并不容易。
答案 1 :(得分:1)
我已经整理了一个小应用程序来演示如何解决这个问题。我的getToolTipText()
中的方法采用了覆盖JButton
方法。它使用“FontMetrics”测试按钮的大小,根据文本的大小计算右侧和左侧插图。如果您运行演示,则可以调整窗口大小并将鼠标悬停在上面以尝试获取工具提示。我只应该显示是否有省略号。这是代码:
public class GUITest {
JFrame frame;
public static void main(String[] args){
new GUITest();
}
public GUITest() {
frame = new JFrame("test");
frame.setSize(300,300);
addStuffToFrame();
SwingUtilities.invokeLater(new Runnable(){
public void run() {
frame.setVisible(true);
}
});
}
private void addStuffToFrame() {
JPanel panel = new JPanel();
JButton b = new JButton("will this cause an elipsis?") {
public String getToolTipText() {
FontMetrics fm = getFontMetrics(getFont());
String text = getText();
int textWidth = fm.stringWidth(text);
return (textWidth > (getSize().width - getInsets().left - getInsets().right) ? text : null);
}
};
ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
toolTipManager.registerComponent(b);
frame.setContentPane(b);
}
}
答案 2 :(得分:1)
我猜想
时会显示ellispsegetPrefferredSize().width > getSize().width