0

我有一个非常长的宽度为 80000 的 JLabel。它位于宽度为 80000 的面板中。但是,标签在面板中间以“...”结尾,这意味着它被切断了。我已将 JLabel 的最大尺寸、最小尺寸、尺寸和首选尺寸设置为宽度为 80000。它所在的面板位于 JScrollPane 内部。

任何想法为什么 JLabel 似乎没有它实际认为的宽度?

4

3 回答 3

2

例如字体和字符串

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JLabelIntoJScrollPane {

    private JFrame frame = new JFrame();

    public JLabelIntoJScrollPane() {
        AlphaChars aChars = new AlphaChars();
        String str = aChars.getNext(80000);
        JTextArea textarea = new JTextArea(str);
        textarea.setLineWrap(true);
        JScrollPane jScrollPane = new JScrollPane(textarea);

        JLabel label = new JLabel(str);
        label.setPreferredSize(new Dimension(550000, 60)); 
        // replace new Dimension(int, int) with proper way
        // I'd be use TextLayout or one of three methods
        // how to get size from Font and String

        frame.pack();

        final JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(label);

        JScrollPane jScrollPane1 = new JScrollPane(panel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(jScrollPane, BorderLayout.CENTER);
        frame.add(jScrollPane1, BorderLayout.SOUTH);

        frame.setSize(400, 300);
        frame.setVisible(true);

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                System.out.println(panel.getPreferredSize());
            }
        });
    }

    private class AlphaChars {

        public static final int MIN_LENGTH = 80000;
        private java.util.Random rand = new java.util.Random();
        private char[] AlphaChars = {
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
            'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
            'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '*', '/', '<', '>', '&',
            '#', '@', '{', '}', '?', ':', '_', '"', '!', ')', '('};

        public String getNext() {
            StringBuilder strbuf = new StringBuilder();
            for (int i = 0; i < MIN_LENGTH; i++) {
                strbuf.append(getAlphaChars()[getRand().nextInt(getAlphaChars().length)]);
            }
            return strbuf.toString();
        }

        public String getNext(int reqLenght) {
            StringBuilder strbuf = new StringBuilder();
            for (int i = 0; i < reqLenght; i++) {
                strbuf.append(getAlphaChars()[getRand().nextInt(getAlphaChars().length)]);
            }
            return strbuf.toString();
        }

        public java.util.Random getRand() {
            return rand;
        }

        public void setRand(java.util.Random aRand) {
            rand = aRand;
        }

        public char[] getAlphaChars() {
            return AlphaChars;
        }

        public void setAlphaChars(char[] aAlphaChars) {
            AlphaChars = aAlphaChars;
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JLabelIntoJScrollPane();
            }
        });
    }
}
于 2012-06-05T21:59:13.347 回答
1

根据 Andrew Thompson 的评论 - 发布一个代码示例来演示您的问题以获得更好的答案。

如果您在让标签显示字符串内容时遇到问题...

1) 使用 FontMetrics 确定您的字符串实际需要的大小。

Graphics g; //initialize this with your component's Graphics, as passed in to paintComponent
Rectangle2D bounds = g.getFontMetrics().getStringBounds(reallyLongString, g)

2) 请记住,标签的边距会有一些可变的缓冲。这应该等于它的 insets,尽管可能有其他项会增加标签所需的大小超过字符串本身的大小。

Insets i = getInsets();

3) 在 1 和 2 之后,您应该能够确定您的标签需要的尺寸:

minWidth = bounds.getWidth() + i.left + i.right;

4)如果这还不够,那么还有其他一些我错过的因素。您总是可以通过实验测试找出阈值 - 逐渐增加标签的大小,直到它停止给您椭圆。

于 2012-06-05T21:16:22.073 回答
1

这里有一个方法:

您可以repaint使用JLabel自己的自定义图形或文本:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(foregroundImage, x, y, this);
    g.drawString("YOUR BIG STRING");
    jlabel.setBounds(0,0,100,100); //set it to your JLabel bounds...
    jlabel.paint(g);
}
于 2012-06-05T21:17:38.270 回答