JProgressBar文本溢出 [英] JProgressBar text overflow
问题描述
我的程序在JProgressBar中写入文本.问题是文本比JProgressBar的宽度还要宽.
My program writes text in a JProgressBar. The problem is the text is wider than the JProgressBar's width.
我已经更改了JProgressBar的高度,以便能够在两行上写文本,但是我不想更改宽度.
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.
如果文本太宽,如何更改JProgressBar的溢出以使文本返回到下一行?
How to change the JProgressBar's overflow to make the text going back to the next line if it is too wide?
我希望这足够清楚:)
这就是我想要的:
谢谢
编辑
@mKorbel回复后,结果如下:
After @mKorbel reply the result looks like this:
标签工作得很好,但是为什么要剥离这些标签?
The label works quite fine but why those strips?
我的代码:
// 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);
推荐答案
该程序是用Java 6开发的.似乎JLayer不是 可用的.如果我写错了,您能提供一些有关如何做的代码吗 这个吗?
the program is developed with Java 6. It seems JLayer is not available. If I'm wrong, could you provide some code on how to do this?
-
您能否提供一些有关如何执行此操作的代码? ---> JLayer& @aterai的JProgressBar ,有关更多想法,请参阅他的博客,对于Java6,您可以使用JXLayer
could you provide some code on how to do this? --- > JLayer & JProgressBar by @aterai, for more ideas see his blog, for Java6 you can to use JXLayer
或使用GlassPane具有非常相似的逻辑
or with very similair logics by using GlassPane
一些笔记
-
应使用GBC代替NullLayout
should be used GBC instead of NullLayout
添加图标或透明背景可以变得更好
can be nicer with added Icon or transparent background
(通过将LayoutManager添加到JLabel),可以放置一堆JComponent,其效果与JPanel相同
(by add LayoutManager to JLabel) there can be placed bunch of JComponents with the same effect as for JPanel
例如
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
my first thought was using html, but astonishingly (for me) the progressbar doesn't support it ... by @kleopatra
和
我认为我的问题可能还不够清楚.我不要文字 超过JProgressBar边界.另外,我不想手动插入 行返回(即否
).我添加了一张我想要的图片.经过 @MaxbesterI think my question may not be clear enough. I don't want the text to exceed the JProgressBar borders. Plus, I don't want to insert manually line returns (ie no
). I added a picture of what I want. by @Maxbester- 结果是将
JProgressBar
用作Container
,放在正确的LayoutManager
位置,并在JLabel
之前覆盖JProgressBar
- result is to use
JProgressBar
asContainer
, put there properLayoutManager
, overlayJProgressBar
byJLabel
- 增强功能,可将
EmptyBorder
设置为JLabel
,例如label.setBorder(new EmptyBorder(15, 15, 15, 15));
- enhancements, to set
EmptyBorder
forJLabel
, e.g.label.setBorder(new EmptyBorder(15, 15, 15, 15));
EDIT2(图标也可以是半透明的,可以覆盖JProgressBar)
EDIT2 (Icon is, can be semi_transparent too, can overlay JProgressBar)
代码可能类似于
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(); } }); } }
WindowsClassicLookAndFeel的默认剥离(图标不是半透明的)
default stripping for WindowsClassicLookAndFeel (Icon isn't semi_transparent)
这篇关于JProgressBar文本溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
-