首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JProgressBar文本溢出

JProgressBar文本溢出
EN

Stack Overflow用户
提问于 2013-08-21 07:00:35
回答 2查看 4.4K关注 0票数 2

我的程序用JProgressBar写文本。问题是文本比JProgressBar的宽度更宽。

我已经更改了JProgressBar的高度,以便能够将文本写在两行上,但我不想更改宽度。

如果JProgressBar太宽,如何更改JProgressBar的溢出以使文本返回下一行?

我希望这是足够清楚的:)

以下是我想要的:

谢谢

编辑

在@mKorbel回复之后,结果如下:

标签很好,但为什么是那些条子呢?

我的代码:

代码语言:javascript
复制
// Construct progress bar
JProgressBar progressBar = new JProgressBar(0, 100);
// Set progressBar color
progressBar.setForeground(new Color(0,176,80));

// Edit progress bar height
Dimension prefSize = progressBar.getPreferredSize();
prefSize.height = 50;
progressBar.setPreferredSize(prefSize);

// Set the layout
progressBar.setLayout(new BorderLayout(5, 5));

// Set progress bar value
progressBar.setValue(38);

// Construct the label
JLabel progressLabel = new JLabel("<html>I have already changed the JProgressBar's height to be able to write the text on two lines but I don't want to the change the width.</html>");
// Set alignment
progressLabel.setHorizontalAlignment(JLabel.CENTER);
progressLabel.setVerticalAlignment(JLabel.CENTER);

// Set the borders
progressLabel.setBorder(new EmptyBorder(15, 15, 15, 15));

// Change the font
font = progressLabel.getFont();
font = font.deriveFont(Font.BOLD, 12);
progressLabel.setFont(font);

// Add label to the progress bar
progressBar.add(progressLabel, BorderLayout.CENTER);

// Add progress bar to the frame
frame.add(progressBar);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-21 10:40:23

这个程序是用Java 6开发的,看来JLayer是不可用的。如果我错了,你能提供一些代码来说明如何做到这一点吗?

  • 你能提供一些关于如何做到这一点的代码吗?- JLayer & JProgressBar by @aterai,关于更多的想法,请看他的博客,Java6你可以使用JXLayer。
  • 或者使用GlassPane具有非常相似的逻辑

一些笔记

  • 应该使用GBC而不是NullLayout。
  • 添加图标或透明背景可以更好
  • (将LayoutManager添加到JLabel中)可以放置与JPanel相同的JComponents束

例如

代码语言:javascript
复制
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.UIManager;
//https://stackoverflow.com/questions/14560680/jprogressbar-low-values-will-not-be-displayed
public class ProgressSample {

    private JFrame frame = new JFrame("GlassPane instead of JLayer");
    private JLabel label;
    private GridBagConstraints gbc = new GridBagConstraints();
    private JProgressBar progressSeven;

    public ProgressSample() {
        frame.setLayout(new FlowLayout());
        frame.add(new JButton("test"));
        frame.add(new JCheckBox("test"));
        frame.add(new JRadioButton("test"));
        // Nothing is displayed if value is lover that 6
        JProgressBar progressSix = new JProgressBar(0, 100);
        progressSix.setValue(2);
        frame.add(progressSix);
        // but this works value is higher that 6
        progressSeven = new JProgressBar(0, 100);
        progressSeven.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentMoved(ComponentEvent e) {
                label.setBounds(
                        (int) progressSeven.getBounds().getX(),
                        (int) progressSeven.getBounds().getY(),
                        label.getPreferredSize().width,
                        label.getPreferredSize().height);
            }
        });
        progressSeven.setValue(7);
        frame.add(progressSeven);
        label = new JLabel();
        label.setText("<html> Concurency Issues in Swing<br>"
                + " never to use Thread.sleep(int) <br>"
                + " durring EDT, simple to freeze GUI </html>");
        label.setPreferredSize(new Dimension(label.getPreferredSize().width, label.getPreferredSize().height));
        Container glassPane = (Container) frame.getRootPane().getGlassPane();
        glassPane.setVisible(true);
        glassPane.setLayout(null);
        glassPane.add(label, gbc);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        ProgressSample dialogTest = new ProgressSample();
    }
}

编辑

  • 评论

我的第一个想法是使用html,但令人惊讶的是(对我来说)进度栏不支持它.@kleopatra

我想我的问题可能不够清楚。我不希望文本超过JProgressBar边界。另外,我不想手动插入行返回(不) )。我加了一张我想要的照片。@Maxbester

  • 结果是采用JProgressBar作为Container,放置适当的LayoutManager,通过JLabel叠加JProgressBar

  • 增强,将EmptyBorder设置为JLabel,例如label.setBorder(new EmptyBorder(15, 15, 15, 15));

EDIT2 (图标是,也可以是semi_transparent,可以覆盖JProgressBar)

代码可能类似于

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

public class JProgressBarWithJLabel {

    private JFrame frame = new JFrame("JLabel in JProgressBar");
    private JLabel label;
    private JProgressBar progressSeven;

    public JProgressBarWithJLabel() {
        progressSeven = new JProgressBar(0, 100){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 60);
            }
        };
        progressSeven.setValue(38);
        progressSeven.setLayout(new BorderLayout(5, 5));
        label = new JLabel();
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        label.setBorder(new EmptyBorder(15, 15, 15, 15));
        label.setText("<html>I have already changed the JProgressBar's height "
                + "to be able to write the text on two lines but I don't want "
                + "to the change the width.</html>");
        progressSeven.add(label, BorderLayout.CENTER);
        frame.add(progressSeven);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(laf.getName())) {
                    UIManager.setLookAndFeel(laf.getClassName());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JProgressBarWithJLabel();
            }
        });
    }
}

EDIT3:

WindowsClassicLookAndFeel的默认剥离(图标不是semi_transparent)

票数 4
EN

Stack Overflow用户

发布于 2015-10-16 16:54:22

可得到的答案并没有让我满意。因此,为了满足自己的需要,我实现了以下替代解决方案。

代码语言:javascript
复制
import javax.swing.JProgressBar;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;

public class MultilineProgressBar extends JProgressBar
{
    private static final String FONT_NAME = "Dialog";
    private static final int FONT_SIZE = 12;

    private static final int INTERLINE_COEFFICIENT = 2;
    private static final int NEWLINE_OFFSET = FONT_SIZE * INTERLINE_COEFFICIENT;
    private static final int CENTERING_DIVISOR = 2;


    @Override
    protected void paintComponent(final Graphics graphics)
    {
        super.paintComponent(graphics);

        final String componentString = getString();

        int i = componentString.indexOf('\n');
        if (i == -1)
            return;

        // Draw first line of the component's string
        String currentString = componentString.substring(0, i);
        Rectangle2D stringBounds = getFontMetrics(getFont()).getStringBounds(currentString, graphics);
        graphics.setFont(new Font(FONT_NAME, Font.BOLD, FONT_SIZE));
        graphics.setColor(Color.WHITE);
        graphics.drawString(currentString,
                            (int) (getWidth() - stringBounds.getWidth()) / CENTERING_DIVISOR,
                            (int) (getHeight() - stringBounds.getHeight()) / CENTERING_DIVISOR);

        ++i;
        if (i >= componentString.length())
            return;

        // Draw second line of the component's string
        currentString = componentString.substring(i);
        stringBounds = getFontMetrics(getFont()).getStringBounds(currentString, graphics);
        graphics.drawString(currentString,
                            (int) (getWidth() - stringBounds.getWidth()) / CENTERING_DIVISOR,
                            (int) ((getHeight() - stringBounds.getHeight()) / CENTERING_DIVISOR) + NEWLINE_OFFSET);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18350786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档