该text-overflow:ellipsis;CSS属性必须是的,微软已经适合网页所做的几件事情之一.
所有其他浏览器现在都支持它...除了Firefox.
自2005年以来,Firefox开发人员一直在争论它,但尽管对它有明显的需求,它们似乎无法真正实现它(即使是实验性-moz-实现也足够了).
几年前,有人设法破解Firefox 3以支持省略号.黑客使用该-moz-binding功能使用XUL实现它.现在有很多网站正在使用这种黑客攻击.
坏消息?Firefox 4正在删除该-moz-binding功能,这意味着此黑客将无法再使用.
因此,一旦Firefox 4发布(本月晚些时候,我听到),我们将回到让它无法支持此功能的问题.
所以我的问题是:还有其他方法吗?(我试图避免回到Javascript解决方案,如果可能的话)
[编辑]
很多投票,所以我显然不是唯一想知道的人,但到目前为止我有一个答案基本上都是'使用javascript'.我仍然希望找到一个根本不需要JS的解决方案,或者最糟糕的是只将它用作CSS功能不起作用的后备.因此,我将在这个问题上发布一个赏金,关于有人在某个地方找到答案的机会.
[编辑]
更新:Firefox已进入快速开发模式,但尽管现在正在发布FF5,但仍不支持此功能.现在大多数用户已从FF3.6升级,黑客不再是解决方案.好消息我被告知它可能会被添加到Firefox 6中,而新版本的发布时间表应该会在几个月内完成.如果是这样,那么我想我可以等一下,但遗憾的是他们不能早点排序.
[最终编辑]
我看到省略号功能最终被添加到Firefox的"Aurora频道"(即开发版).这意味着它现在应该作为Firefox 7的一部分发布,它将于2011年底发布.真是令人宽慰.
可在此处获取发行说明:https://developer.mozilla.org/en-US/Firefox/Releases/7
在Java中,当由于空间不足而无法显示JLabel的文本时,文本被截断并且最后添加"...".
如何轻松找出当前JLabel是显示全文还是截断?
编辑:
我看到有一种方法可以通过使用找出文本的大小FontMetrics.但是,此解决方案并未完全回答这个问题.在JLabel的文本包含HTML装饰的metrics.stringWidth()情况下,还将计算HTML标签的宽度.因此,可能会发生metrics.stringWidth()比JLabel的宽度更大的结果,但仍然可以正确显示文本.
有没有办法知道在显示文本时JLabel本身做出了什么决定.它是否决定截断文本.
在我的应用程序中,我有一个字体大小超过200的标签.这个标签包含大的上下(不规则)间隙.我该如何删除它?
这是我的代码:
package Core;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class LabelDemo extends JPanel {
public LabelDemo() {
super(new GridBagLayout());
JLabel label2;
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
// Create the other labels.
label2 = new JLabel("Text-Only Label");
label2.setBorder(BorderFactory.createTitledBorder("aaaaaaaa"));
label2.setFont(new Font("Verdana", Font.PLAIN, (int) 220));
// label2.setBorder(new EmptyBorder(-50, 0, 0, 0));
// Add the labels.
add(label2, c);
}
/**
* Create the GUI …Run Code Online (Sandbox Code Playgroud) 我正在使用StringUtils.abbreviateMiddle(string, middle, targetLength);缩写中间的字符串,但使用此方法切断了单词.有没有一种方法,它只会在最接近弦的中间位置的空间切断弦?
public static String shortenStringMiddle(String string, String middle, int targetLength) {
targetLength = Math.abs(targetLength);
if (string != null && string.length() > targetLength) {
return StringUtils.abbreviateMiddle(string, middle, targetLength);
}
else {
return string;
}
}
Run Code Online (Sandbox Code Playgroud)
输入如果应用于此文本:
东南亚鱼虾养殖的疾病控制 - 诊断和畜牧技术:SEAFDEC-OIE研讨会论文集 - 东南亚鱼虾养殖疾病控制研讨会 - 诊断和畜牧技术,2001年12月4日至6日,伊洛伊洛市,菲律宾
System.out.println(StringUtils.abbreviateMiddle("Disease Control in Fish and Shrimp Aquaculture in Southeast Asia - Diagnosis and Husbandry Techniques: Proceedings of the SEAFDEC-OIE Seminar-Workshop on Disease Control in Fish and Shrimp Aquaculture in Southeast Asia - Diagnosis and …Run Code Online (Sandbox Code Playgroud) 默认情况下JLabel,如果文本太长而无法像这样完全显示,则会在右侧截断3个点的文本:

(图像来自我正在处理的一个小型备份应用程序)。如您所见,最后一个JLabel上方的“取消”按钮被切除。这种行为显然是不可取的,因为文本中最相关的部分被删去了。
我希望结果标签在此图像中看起来像(右列,对分辨率不佳表示抱歉):

到目前为止,我已经尝试将标签内文本的对齐方式更改为JLabel.RIGHT,将组件方向更改为ComponentOrientation.RIGHT_TO_LEFT,set horizontalTextPosition,全部无效:
import javax.swing.*;
import java.awt.*;
public class Backup
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(()->{
JLabel label = new JLabel("Some test text 1 2 3 4 5 6 7 8 9 10 abcdefghjiklmnopqrstuvwxyz", JLabel.RIGHT);
label.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
label.setHorizontalTextPosition(JLabel.RIGHT);
JFrame frame = new JFrame();
frame.add(label);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用HTML:
<html>
<body>
<p style="width:300px;overflow-x:hidden;direction:rtl">
kladsjhglakjsjdghlekfalksjdvhlkjdsnkljhsdlkvjhasdkjhfslkdjhcksdjhvflkasjvhlkajdlkajvsdhvlkjsadhaaaaaaaaaaaaa
</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
尽管此功能可以在浏览器中正常运行,但swing似乎不支持足够的样式属性集来支持此行为。
编写自己的实现完全满足此要求的实现并不难。不过,我想知道是否有实现这一目标的“途径”。
这里有一个类似的问题: 如何更改JLabel字体的大小以获取最大大小
但它不适用于倒退.
因此,如果你做得JPanel更大,字体就会增长,但是如果你让它变JLabel小,字体就像以前一样
如何在调整大小时Jlabel根据JPanel大小增加字体?
我正在尝试创建一个左侧文本对齐且右侧图标对齐的JLabel,我尝试了以下代码:
_ip = new JLabel(ip);
_ip.setFont(boldFont);
_ip.setBounds(5, 0, 100, 50);
_ip.setIcon(images.ipBan);
_ip.setBorder(BorderFactory.createLineBorder(Color.black, 1));
_ip.setHorizontalTextPosition(SwingConstants.LEFT);
add(_ip);
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:

红色图像显示实际图像对齐,灰色图像显示我想要图像的位置.
如果我添加
_ip.setAlignmentX(JLabel.RIGHT_ALIGNMENT);
Run Code Online (Sandbox Code Playgroud)
什么都没发生,如果我补充
_ip.setHorizontalAlignment(JLabel.RIGHT);
Run Code Online (Sandbox Code Playgroud)
图标右对齐,但文本右对齐,我希望它左对齐
有办法吗?
我有一个实现的自定义JTree实现convertValueToText.这种实现取决于某些全球状态.如果返回的字符串比以前返回的字符串更长(实际上我认为更宽,就像在像素中触发它),文本将被截断并用"..."填充.当重绘是由(de)选择元素或repaint树上引起时,这是真的.
convertValueToText以这种方式实施是否有效?(我知道树形显示不会自动更新).
如何摆脱"..."并强制所有元素用他们当前的文本值正确绘制?
UPDATE2:
显然我违反了Swings相当严格的踩踏政策(http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html).进行更新:
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
for (int row = 0; row < tree.getRowCount(); row++) {
((DefaultTreeModel) tree.getModel())
.nodeChanged((TreeNode) tree.getPathForRow(row)
.getLastPathComponent());
}
}
});
Run Code Online (Sandbox Code Playgroud)
似乎工作正常.
更新:
这是一个最小的例子:
import java.util.Enumeration;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
public class WeirdTreeFrame extends JFrame {
public class WeirdTree extends JTree {
public WeirdTree(TreeNode root) {
super(root);
}
@Override
public String convertValueToText(Object value, boolean selected,
boolean expanded, …Run Code Online (Sandbox Code Playgroud) 如何测试具有设置大小的JLabel是否无法显示它设置为显示的所有文本?
我有一个JTextField textField,我有一个任意的String string
我希望文本字段显示字符串的结尾,但切断它不适合的内容并使用"..."代替它.例如,如果字符串是,"Hello How Are You Doing"那么文本字段可能看起来像
...re You Doing
Run Code Online (Sandbox Code Playgroud)
鉴于textfield和string,我该怎么做?
更新:我想这样做的原因是因为它是一个文件选择器,所以我想优先显示文件的结尾.例如,如果用户选择保存在/Users/Name/Documents/Folder1/Folder2/Folder3/file.txt,那么我想显示结束,其余不适合的应该替换为"..."
这是它的地方:
JFileChooser chooser = new JFileChooser();
int response = chooser.showSaveDialog(this);
if(response == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
String string = file.getAbsolutePath();
fileTextField.setText(/* here's where the code would go */);
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它使用遍布文本和图标的自定义按钮.适用于Windows和Linux,但现在OSX用户抱怨.文本不会显示在Mac上,只是'...'.代码看起来很简单,但是当涉及到mac时我很无能为力.我怎样才能解决这个问题?
测试用例:
package example.swingx;
import example.utils.ResourceLoader;
import com.xduke.xlayouts.XTableLayout;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import java.awt.*;
import java.awt.event.ActionEvent;
public class SmallButton extends JButton {
private static ComponentUI ui = new SmallButtonUI();
public SmallButton() {
super();
/* final RepaintManager repaintManager = RepaintManager.currentManager(this);
repaintManager.setDoubleBufferingEnabled(false);
setDebugGraphicsOptions(DebugGraphics.FLASH_OPTION);*/
}
public SmallButton(AbstractAction action) {
super(action);
}
public SmallButton(String text) {
super(text);
}
public SmallButton(Icon icon) {
super(icon);
}
public void updateUI() {
setUI(ui);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel …Run Code Online (Sandbox Code Playgroud) 如果这个问题很简单,请原谅我.我不是GUI专家.但是,我需要创建一个Swing控件,在该控件中,只能根据某些计算(从不允许用户输入)以编程方式插入文本.这里是否有任何偏好使用JLabel与不可编辑的JTextField?我知道两者都有效,但只是好奇在这种情况下使用其中一种是否更好.
在下面的代码中,仅JFrame包含JLabel,位于中心BorderLayout.
package test.swing;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Try_JLabel_01 {
public static void main(String[] arg) {
JFrame frame = new JFrame() {
JLabel label = new JLabel("label");
{
setLayout(new BorderLayout());
add(label, BorderLayout.CENTER);
}
};
frame.pack();
//frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
如果运行,该程序将显示窗口,该窗口完全符合控件大小.
同时,如果我定义自定义控件,则默认窗口大小为零:
public class Try_JLabel_02 {
public static void main(String[] arg) {
JFrame frame = new JFrame() {
//JLabel label = new JLabel("label");
JComponent label = new JComponent() {
@Override
protected …Run Code Online (Sandbox Code Playgroud)