Java JLabel / JButton:在某些系统上,我得到“……”(省略号),而在某些系统上,我没有。 如何强制禁用省略号?

在大多数系统上,我的JLabel中的内容显示正常。 它的存在方式应该始终足以显示其内容文本,因为我基本上这样做:

label.setText(text); label.setFont(new Font(fontName, 0, 12)); int width = label.getFontMetrics(label.getFont()).stringWidth(text); int height = 21; // this should always be enough label.setBounds(new Rectangle(x, y, width, height)); 

但是在某些系统上(不是我自己的,所以我不能那么简单地调试它),它会剪切文本并在最后显示“……”。

你可以在这里看到完整的代码,你可以在这里看到这个例子(Abbildungen_Bijektiv_X3) 。

我也有一些类似的JButton案例。

我怎么能强迫Swing不这样做? (即使它认为组件太小。)

Swing究竟在哪里处理这个? 我浏览了JButton的代码和一些相关的类,但我没有真正找到它切割文本的代码并添加了省略号。

不应该设置标签的边界。

这是布局管理器的工作。 学习使用布局管理器,您将不会遇到此问题。

编辑:

布局管理员使用:

 label.setSize( label.getPreferredSize() ); 

我现在正在这样做(对于按钮,但你可以以类似的方式对其他控件执行):

 static public class ButtonUI extends MetalButtonUI { public static ComponentUI createUI(JComponent c) { return new ButtonUI(); } @Override public void paint(Graphics g, JComponent c) { JSimpleLabel.activateAntiAliasing(g); AbstractButton b = (AbstractButton) c; ButtonModel model = b.getModel(); String text = b.getText(); clearTextShiftOffset(); // perform UI specific press action, eg Windows L&F shifts text if (model.isArmed() && model.isPressed()) { paintButtonPressed(g,b); } FontMetrics metrics = g.getFontMetrics(); Rectangle2D stringBounds = metrics.getStringBounds(text, g); g.drawString(text, (b.getWidth() - (int)stringBounds.getWidth()) / 2, metrics.getLeading() + metrics.getMaxAscent() + (b.getHeight() - (int)stringBounds.getHeight()) / 2); if (b.isFocusPainted() && b.hasFocus()) { Rectangle viewRect = new Rectangle(); final int inset = 1; viewRect.x = inset; viewRect.y = inset; viewRect.width = b.getWidth() - (inset + viewRect.x) - 1; viewRect.height = b.getHeight() - (inset + viewRect.y) - 1; g.setColor(getFocusColor()); g.drawRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); } } } public void init() { try { UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel() { private static final long serialVersionUID = 1L; @Override public UIDefaults getDefaults() { UIDefaults table = super.getDefaults(); table.put("ButtonUI", ButtonUI.class.getName()); return table; } }); } catch (Exception e) { e.printStackTrace(); } // ... } 

您可以使用跨平台的外观(如Nimbus)来阻止这种情况发生