【问题标题】:JProgressBar.stringPainted(true); is not workingJProgressBar.stringPainted(true);不管用
【发布时间】:2014-10-14 10:16:51
【问题描述】:

这是我的 java 代码的一部分,在这段代码中,我写了当我单击按钮时,JProgressBar 的值应该变为0stringPainted() 返回true,但"string painted" 不是单击按钮时可见,请帮助。

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) {
            isStringToBePainted = b;
        }
    }

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

【问题讨论】:

    标签: java swing paintcomponent jprogressbar


    【解决方案1】:

    您需要在被覆盖的方法中调用JProgressBar setStringPainted 方法:

    public class TestGame implements ActionListener
    {
    
      static int y;
      CustomProgressBar progressBar = new CustomProgressBar();
    
      public static void main(String arg[]) throws Exception
      {
        new TestGame();
      }
    
      public TestGame() 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(progressBar);
        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 = this.getSize();
            if (this.getPercentComplete() < 0.9)
              TestGame.y = (int) (size.height - size.height * this.getPercentComplete());
            String text = getString();
            g.setColor(Color.BLACK);
            g.drawString(text, 0, TestGame.y);
          }
        }
    
        @Override
        public void setStringPainted(boolean b)
        {
          super.setStringPainted(b);
          isStringToBePainted = b;
        }
      }
    
      @Override
      public void actionPerformed(ActionEvent e)
      {
        progressBar.setValue(0);
        progressBar.setStringPainted(true);
      }
    
    }
    

    【讨论】:

    • 为什么我运行它时,它只是垂直和水平显示到%0?
    • 您到底在期待什么?您可能还需要接受答案或至少支持它,因为您的主要问题是为什么它不可见:)
    • 你说得对,但我只需要横线不需要竖线,那我该怎么办???
    • 你正在自己绘制字符串表示g.drawString(text, 0, TestGame.y); 在 (0,y) 坐标中。
    【解决方案2】:

    您忘记拨打super.setStringPainted(b)

    public void setStringPainted(boolean b) {
        super.setStringPainted(b);
        isStringToBePainted = b;
    }
    

    有点不清楚您要做什么,但您可能希望研究覆盖 ProgressBarUI,而不是组件。看一看:http://docs.oracle.com/javase/6/docs/api/javax/swing/plaf/basic/BasicProgressBarUI.html

    【讨论】:

    • 如果可以的话,您能解释一下吗?
    • 为什么当我运行它时,它只是垂直和水平显示到 %0
    • 你说得对,但我只需要横线不需要竖线,那我该怎么办???
    • 我认为 super.paintComponent(g);应该是paintComponent中的最后一行代码,否则String没有被绘制
    【解决方案3】:

    您需要在设置新的isStringToBePainted 的值后调用paintAll 方法。作为一个建议,使进度条更宽,以便您可以欣赏整个百分比标签。我添加了一个简单的线程例程来观察您的自定义组件的工作情况,下面是它的一些图片:

    以下代码包含在标记为#NEW的cmets下所做的修改的详细信息:

    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, Runnable {
        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.setUndecorated(true);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setLayout(new FlowLayout());
            btn.addActionListener(this);
    
            // #NEW: Make the progress bar a little bit wider
            b.setPreferredSize(new Dimension(25, 250));
    
            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) {
                isStringToBePainted = b;
    
                // #NEW: This updates the progressbar after clicking the button, thus fixing your problem
                paintAll(getGraphics());
            }
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            b.setValue(0);
            b.setStringPainted(true);
    
            // #NEW: A simple thread that creates a visual of your component working 
            new Thread(this).start();
        }
    
        // #NEW: This is the threading routine, it only changes the progressbar value from 0 to 100 every 10th of a second  
        @Override
        public void run() {
            while (b.getPercentComplete() < 1.0) { 
                b.setValue(b.getValue() + 1);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多