Java 是否可以在垂直JProgressbar中水平保存文本
Java 是否可以在垂直JProgressbar中水平保存文本,java,swing,jprogressbar,Java,Swing,Jprogressbar,JProgressBar在JProgressBar中。垂直模式旋转String 是否可以保存字符串水平 您可以在自定义的BasicProgressBarUI中重写paintString()。我们看到了一个相关的例子。这是一个正确的-Hack,但如果对我有效: 如果打印标签时UI要求方向,我会在堆栈中查找,如果是,我会返回另一个方向 JProgressBar progress = new JProgressBar(){ @Override
JProgressBar
在JProgressBar中。垂直模式旋转String
是否可以保存字符串水平
您可以在自定义的BasicProgressBarUI
中重写paintString()
。我们看到了一个相关的例子。这是一个正确的-Hack,但如果对我有效:
如果打印标签时UI要求方向,我会在堆栈中查找,如果是,我会返回另一个方向
JProgressBar progress = new JProgressBar(){
@Override
public int getOrientation() {
for( StackTraceElement elem : new Throwable().getStackTrace() ) {
if(elem.getMethodName().equals( "paintText" ) || (elem.getMethodName().equals( "paintString" ))) {
return JProgressBar.HORIZONTAL;
}
}
return JProgressBar.VERTICAL;
}
};
- 另一个选项是使用
BorderLayout
+JLabel
- 或者,如果您使用的是Java 1.7.0,则可以使用
JLayer
import java.awt.*;
导入java.awt.event.*;
导入java.beans。*;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.plaf.LayerUI;
公共类ProgressBarLabelTest{
私有静态JProgressBar makeProgressBar1(BoundedRangeModel模型){
JProgressBar progressBar=新的JProgressBar(型号){
专用JLabel标签=新JLabel(“000/100”,SwingConstants.CENTER);
私有ChangeListener ChangeListener=null;
@重写公共void updateUI(){
removeAll();
如果(changeListener!=null)删除changeListener(changeListener);
super.updateUI();
invokeLater(新的Runnable(){
@重写公共无效运行(){
setLayout(新的BorderLayout());
changeListener=新的changeListener(){
@覆盖公共无效状态已更改(更改事件e){
int iv=(int)(100*getPercentComplete());
label.setText(String.format(“%03d/100”,iv));
}
};
addChangeListener(changeListener);
添加(标签);
label.setboorder(BorderFactory.createEmptyByOrder(0,4,0,4));
}
});
}
@重写公共维度getPreferredSize(){
维度d=super.getPreferredSize();
Insets i=label.getInsets();
d、 宽度=label.getPreferredSize().width+i.left+i.right;
返回d;
}
};
initProgressBar(progressBar);
返回进度条;
}
私有静态JComponent makeProgressBar2(BoundedRangeModel模型){
最终JLabel标签=新JLabel(“000/100”);
label.setboorder(BorderFactory.createEmptyByOrder(4,4,4,4));
LayerUI LayerUI=新LayerUI(){
专用最终JPanel rubberStamp=新JPanel();
@替代公共空白绘制(图形g、J组件c){
超级油漆(g,c);
维度d=label.getPreferredSize();
intx=(c.getWidth()-d.width)/2;
int y=(c.getHeight()-d.height)/2;
JLayer JLayer=(JLayer)c;
JProgressBar进度=(JProgressBar)jlayer.getView();
int iv=(int)(100*progress.getPercentComplete());
label.setText(String.format(“%03d/100”,iv));
SwingUtilities.paintComponent(
g、 标签,橡皮戳,x,y,d.宽度,d.高度);
}
};
JProgressBar progressBar=新的JProgressBar(型号){
@重写公共维度getPreferredSize(){
维度d=super.getPreferredSize();
Insets i=label.getInsets();
d、 宽度=label.getPreferredSize().width+i.left+i.right;
返回d;
}
};
initProgressBar(progressBar);
返回新的JLayer(progressBar,layerUI);
}
公共JComponent makeUI(){
final BoundedRangeModel m=新的DefaultBoundedRangeModel();
JProgressBar progressBar0=新的JProgressBar(m);
initProgressBar(progressBar0);
progressBar0.SetStringPaint(真);
JPanel p=新的JPanel();
p、 添加(0);
p、 增加(1(m));
p、 增加(2(m));
p、 添加(新的JButton(新的AbstractAction(“+10”){
私有整数i=0;
@覆盖已执行的公共无效操作(ActionEvent e){
m、 设定值(i=(i>=100)?0:i+10);
}
}));
返回p;
}
私有静态void initProgressBar(JProgressBar progressBar){
progressBar.setOrientation(SwingConstants.VERTICAL);
progressBar.SetStringPaint(假);
progressBar.setForeground(颜色为绿色);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@重写公共void run(){createAndShowGUI();}
});
}
公共静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的ProgressBarLabelTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
我现在不知道这是否可行,但您可以使用引擎盖下的标签或按钮创建自己的swing组件。JProgressBar.VERTICAL的常量没有解决somehow@mKorbel这是一个惊喜:)
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.LayerUI;
public class ProgressBarLabelTest {
private static JProgressBar makeProgressBar1(BoundedRangeModel model) {
JProgressBar progressBar = new JProgressBar(model) {
private JLabel label = new JLabel("000/100", SwingConstants.CENTER);
private ChangeListener changeListener = null;
@Override public void updateUI() {
removeAll();
if(changeListener!=null) removeChangeListener(changeListener);
super.updateUI();
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
setLayout(new BorderLayout());
changeListener = new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
int iv = (int)(100 * getPercentComplete());
label.setText(String.format("%03d/100", iv));
}
};
addChangeListener(changeListener);
add(label);
label.setBorder(BorderFactory.createEmptyBorder(0,4,0,4));
}
});
}
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
Insets i = label.getInsets();
d.width = label.getPreferredSize().width + i.left + i.right;
return d;
}
};
initProgressBar(progressBar);
return progressBar;
}
private static JComponent makeProgressBar2(BoundedRangeModel model) {
final JLabel label = new JLabel("000/100");
label.setBorder(BorderFactory.createEmptyBorder(4,4,4,4));
LayerUI<JProgressBar> layerUI = new LayerUI<JProgressBar>() {
private final JPanel rubberStamp = new JPanel();
@Override public void paint(Graphics g, JComponent c) {
super.paint(g, c);
Dimension d = label.getPreferredSize();
int x = (c.getWidth() - d.width) / 2;
int y = (c.getHeight() - d.height) / 2;
JLayer jlayer = (JLayer)c;
JProgressBar progress = (JProgressBar)jlayer.getView();
int iv = (int)(100 * progress.getPercentComplete());
label.setText(String.format("%03d/100", iv));
SwingUtilities.paintComponent(
g, label, rubberStamp, x, y, d.width, d.height);
}
};
JProgressBar progressBar = new JProgressBar(model) {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
Insets i = label.getInsets();
d.width = label.getPreferredSize().width + i.left + i.right;
return d;
}
};
initProgressBar(progressBar);
return new JLayer<JProgressBar>(progressBar, layerUI);
}
public JComponent makeUI() {
final BoundedRangeModel m = new DefaultBoundedRangeModel();
JProgressBar progressBar0 = new JProgressBar(m);
initProgressBar(progressBar0);
progressBar0.setStringPainted(true);
JPanel p = new JPanel();
p.add(progressBar0);
p.add(makeProgressBar1(m));
p.add(makeProgressBar2(m));
p.add(new JButton(new AbstractAction("+10") {
private int i = 0;
@Override public void actionPerformed(ActionEvent e) {
m.setValue(i = (i>=100) ? 0 : i + 10);
}
}));
return p;
}
private static void initProgressBar(JProgressBar progressBar) {
progressBar.setOrientation(SwingConstants.VERTICAL);
progressBar.setStringPainted(false);
progressBar.setForeground(Color.GREEN);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new ProgressBarLabelTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}