Java Jprogressbar.setstringpaint(真);他正在画两根弦

Java Jprogressbar.setstringpaint(真);他正在画两根弦,java,swing,paintcomponent,custom-component,jprogressbar,Java,Swing,Paintcomponent,Custom Component,Jprogressbar,这段代码产生了一个问题,当我点击按钮时,两个字符串被绘制,一个水平,一个垂直,但只需要绘制水平字符串,所以请告诉我应该怎么做 import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import jav

这段代码产生了一个问题,当我点击按钮时,两个字符串被绘制,一个水平,一个垂直,但只需要绘制水平字符串,所以请告诉我应该怎么做

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;





public class R implements ActionListener {


    static int y;
    CustomProgressBar b = new CustomProgressBar();



    public static void main(String arg[]) throws Exception {
        new R();
    }



    public R() throws Exception {
        JFrame f = new JFrame();
        JButton btn = new JButton("Click");
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setUndecorated(true);
        f.setLayout(new FlowLayout());
        btn.addActionListener(this);
        f.add(b);
        f.add(btn);
        f.setVisible(true);
    }



    class CustomProgressBar extends JProgressBar{


        private static final long serialVersionUID = 1L;
        private boolean isStringToBePainted = false;
        public CustomProgressBar() {
            super(JProgressBar.VERTICAL,0,100);
        }



        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(isStringToBePainted ) {
                Dimension size = CustomProgressBar.this.getSize();
                if( CustomProgressBar.this.getPercentComplete()<0.9  )
                    R.y = (int)( size.height - size.height * CustomProgressBar.this.getPercentComplete() );     
                String text = getString();
                g.setColor(Color.BLACK );
                g.drawString(text, 0, R.y);
            }
        }
        @Override
        public void setStringPainted(boolean b) {
            super.setStringPainted(b);
            isStringToBePainted=b;
        }
    }



    @Override
    public void actionPerformed(ActionEvent e) {
        b.setStringPainted(true);
    }

}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JProgressBar;
公共类R实现ActionListener{
静态智力;
CustomProgressBar b=新的CustomProgressBar();
公共静态void main(字符串arg[])引发异常{
新R();
}
公共R()引发异常{
JFrame f=新的JFrame();
JButton btn=新JButton(“单击”);
f、 setExtendedState(JFrame.MAXIMIZED_两者);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 未装饰的设置(真实);
f、 setLayout(新的FlowLayout());
btn.addActionListener(此);
f、 添加(b);
f、 添加(btn);
f、 setVisible(真);
}
类CustomProgressBar扩展了JProgressBar{
私有静态最终长serialVersionUID=1L;
私有布尔值IsStringTobePaint=false;
公共定制进度条(){
超级(JProgressBar.VERTICAL,0100);
}
@凌驾
受保护组件(图形g){
超级组件(g);
如果(IsStringTobePaint){
维度大小=CustomProgressBar.this.getSize();

如果(CustomProgressBar.this.getPercentComplete()问题是,组件已在中定义了属性
SetStringPaint
,并且具有预定义的功能…您知道该功能似乎要更改

您也需要定义自己的新属性,您可以控制或更改UI委托的工作方式,这是一项艰巨的工作,因为您需要为您可能想要支持的每个外观和感觉提供一个属性

例如,你可以作弊(一点)…并使用
JLabel
来代替定制绘画

class CustomProgressBar extends JProgressBar {

    private static final long serialVersionUID = 1L;
    private boolean isStringToBePainted = false;

    private JLabel progress;

    public CustomProgressBar() {
        super(JProgressBar.VERTICAL, 0, 100);

        progress = new JLabel("0%");
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weighty = 1;
        gbc.weightx = 1;
        gbc.anchor = GridBagConstraints.SOUTH;
        add(progress, gbc);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        Dimension labelSize = progress.getPreferredSize();
        Insets insets = getInsets();
        if (size.width < labelSize.width) {
            size.width = insets.left + insets.right + labelSize.width;
        }
        return size;
    }

}

class CustomProgressBar扩展了JProgressBar{
私有静态最终长serialVersionUID=1L;
私有布尔值IsStringTobePaint=false;
私人JLabel进程;
公共定制进度条(){
超级(JProgressBar.VERTICAL,0100);
进度=新的JLabel(“0%”);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.weighty=1;
gbc.weightx=1;
gbc.anchor=gridbag.SOUTH;
添加(进度,gbc);
}
@凌驾
公共维度getPreferredSize(){
维度大小=super.getPreferredSize();
维度标签大小=进度。getPreferredSize();
Insets Insets=getInsets();
if(size.width
您仍然需要提供自己的属性来打开或关闭它,但这是一个想法

(ps-我快速查看了一下如何实现自己的UI委托,在复制并粘贴了第三种方法后,我放弃了,因为这将比奖励提供的工作量更多)