gpt4 book ai didi

java - JProgressBar 文本溢出

转载 作者:行者123 更新时间:2023-11-30 07:14:43 25 4
gpt4 key购买 nike

我的程序在 JProgressBar 中写入文本。问题是文本比 JProgressBar 的宽度宽。

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

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

我希望这已经够清楚了:)

这是我想要的:

Overflow in JProgressBar

谢谢


编辑

@mKorbel 回复后结果如下:

enter image description here

标签工作得很好,但为什么有这些 strip ?

我的代码:

// 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);

最佳答案

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?

  • 您能否提供一些有关如何执行此操作的代码? ---> @aterai 的 JLayer & JProgressBar,有关更多想法,请参阅他的博客,对于 Java6,您可以使用 JXLayer

  • 或者通过使用 GlassPane 使用非常相似的逻辑

enter image description here enter image description here enter image description here

一些笔记

  • 应该使用 GBC 而不是 NullLayout

  • 添加图标或透明背景会更好

  • (通过将 LayoutManager 添加到 JLabel)可以放置一堆 JComponents,其效果与 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();
}
}

编辑

  • 评论

my first thought was using html, but astonishingly (for me) the progressbar doesn't support it ... by @kleopatra

I 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,通过覆盖JProgressBar JLabel

enter image description here

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

enter image description here

EDIT2(图标是,也可以半透明,可以覆盖JProgressBar)

enter image description here

代码可以是这样的

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();
}
});
}
}

编辑3:

WindowsClassicLookAndFeel 的默认剥离(图标不是半透明的)

enter image description here

关于java - JProgressBar 文本溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18350786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com