【问题标题】:Jprogressbar.setStringpainted(true); is painting two stringsJprogressbar.setStringpainted(true);正在画两根弦
【发布时间】:2014-10-14 11:55:21
【问题描述】:

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

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 swing paintcomponent custom-component jprogressbar


    【解决方案1】:

    问题是,setStringPainted 属性已在组件中定义,并且具有预定义的功能...您知道似乎想要更改...

    您需要定义一个您自己可以控制的新属性,或者更改 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;
        }
    
    }
    

    您仍然需要提供自己的属性来打开或关闭它,但这是一个想法......

    (ps- 我快速浏览了一下尝试实现我自己的 UI 委托,在我复制并粘贴了我的第三种方法后,我放弃了,因为它只会比奖励提供更多的工作)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多