Java JLabel/JButton:在某些系统上我得到"......"(省略号),在某些系统上我没有.我该如何强制禁用省略号?

Alb*_*ert 6 java swing 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));
Run Code Online (Sandbox Code Playgroud)

但是在某些系统上(不是我自己的,所以我无法真正调试它那么容易),它会剪切文本并在最后显示"......".

您可以在此处查看完整代码,您可以在此处查看示例(Abbildungen_Bijektiv_X3).

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

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

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

cam*_*ckr 5

不需要设置标签的边界.

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

编辑:

布局经理使用:

label.setSize( label.getPreferredSize() );
Run Code Online (Sandbox Code Playgroud)

  • 它的设计都是这样的,我必须自己构建布局.我现在也不想在这里讨论,我应该从头开始重新设计整个事情.此外,问题在哪里?做/计算布局是一项非常简单的任务.只是因为Java试图以某种方式表现出智能,这使得它在这里成为问题.而我只是问我如何禁用它. (2认同)

Alb*_*ert 2

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

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, e.g. 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();
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)