【问题标题】:Overflow JLabel into Another JLabel将 JLabel 溢出到另一个 JLabel
【发布时间】:2014-03-10 18:07:38
【问题描述】:

假设我有一个JLabel 大小的20x20。现在假设我添加了字符串“The quick brown fox jumps over the lazy dog”。这句话对于JLabel 来说太长了,所以它被替换为...。有没有办法让它溢出到另一个JLabel,这样第一个JLabel 就会有“快速的棕色狐狸”,而第二个JLabel 会“跳过懒狗。”?


JLabel lbl = new JLabel("The quick brown fox jumps over the lazy dog.");
lbl.setMaximumSize(new Dimension(20, 20));
add(lbl)

产生一个标有“...”的标签。

【问题讨论】:

  • 您可以使用带有
    标签的 HTML 创建多行 JLabel。
  • 我知道这一点,但假设我在窗口的一侧有一个标签,在另一侧有一个标签。此功能类似于自动溢出的 Word 或 Pages 功能
  • 第二个标签,位于第一个标签的页面/表单的另一侧,它将显示第一个标签溢出的文本?我试图想象,但不能。您能否制作一些 ASCII 艺术作品,或者展示一个 Minimal Complete Example 来说明问题?
  • 还有,为什么要在标签上设置最大尺寸?也许如果有更好的方法来避免这样做,那么原来的问题也会消失。
  • 正如我上面所说的(在朋友关闭我的电脑之前),文字处理器有一个功能可以让你链接文本字段,这样如果你在一个框中输入太多文本,它会自动发送它到另一个盒子。见这里:office.microsoft.com/en-us/publisher-help/…

标签: java swing jlabel


【解决方案1】:

如果您提供更多信息会更容易回答。

我假设您想要的是两个可以并排放置或以任何其他布局放置的标签。如果第一个标签的文本溢出,第二个标签将显示剩余部分。

这里有一个解决方案:

import java.awt.*;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.RenderingHints;
import java.awt.event.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.Override;
import javax.swing.*;
import javax.swing.JLabel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;

public class Test extends JFrame {

    public Test() {
        super("Test overflowing label");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocation(200, 200);
        setSize(300, 200);
        createUI();
    }

    private void createUI() {
        JLabel label2 = new JLabel();
        JLabel label1 = new OverflowingLabel("text to truncate since it's too long ...", label2);

        final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, label1, label2);
        splitPane.setDividerSize(2);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                splitPane.setDividerLocation(.5d);
            }
        });

        setContentPane(splitPane);
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
                test.setVisible(true);
            }
        });
    }

    private class OverflowingLabel extends JLabel  {

        private JLabel[] dependantLabels;

        public OverflowingLabel(String text, JLabel... dependantLabels) {
            super(text);
            this.dependantLabels = dependantLabels;

            addComponentListener(new ComponentAdapter() {
                @Override
                public void componentShown(ComponentEvent e) {
                    overflowText();
                }

                @Override
                public void componentResized(ComponentEvent e) {
                    overflowText();
                }
            });
        }

        private void overflowText() {
            int index = getIndexToChopText();

            String text = getText().substring(index);

            for (JLabel dependantLabel : dependantLabels)
                dependantLabel.setText(text);
        }

        private int getIndexToChopText() {
            Dimension size = getSize();
            FontMetrics metrics = getFontMetrics(getFont());
            String text = getText();

            int index = 0;
            int width = 0;

            while ((index < text.length()) && (width < size.width)) {
                int charWidth = metrics.charWidth(text.charAt(index));

                if ((width + charWidth) > size.width)
                    break;

                index ++;
                width += charWidth;
            }

            return index;
        }

        @Override
        public Dimension getMinimumSize() {
            Dimension size = super.getMinimumSize();
            return new Dimension(0, size.height);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D)g.create();
            Rectangle clip = g2d.getClipBounds();

            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            g2d.setColor(getBackground());
            g2d.fillRect(clip.x, clip.y, clip.width, clip.height);
            g2d.setColor(getForeground());
            g2d.setFont(getFont());

            FontMetrics metrics = g2d.getFontMetrics();
            int baseLine = metrics.getAscent() + metrics.getLeading();

            int index = getIndexToChopText();

            g2d.drawString(getText().substring(0, index), 0, (getHeight() + baseLine) / 2 - 1);

            g2d.dispose();
        }
    }
}

以下是一些演示该行为的屏幕截图:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多