JProgressBar绘画问题 [英] JProgressBar painting issue

查看:60
本文介绍了JProgressBar绘画问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我设置JProgressBar的最小值,值和最大值时,除非关闭窗口并重新打开,否则它们不会更新.

When I set the min, value, and max of my JProgressBar they do not update unless I close the window and reopen it.

图片:

谁能给我任何见解?我在这头上挠头.我测试以确保解析正确完成(是).我测试过直接将数字输入.显然,它可以正常工作,只是在第一次打开窗口时不显示(这使我认为,如果更新值,它将仅显示最后一个值.

Can anyone give me any insight? I am scratching my head on this one. I tested to make sure that the parsing is done correctly(which is is). I tested to just put numbers in directly. Clearly it works, it just does not show the first time the window is opened(which makes me think that if I update the values it will only show the last values.

*编辑*

女士们,先生们,我可以介绍一下……SSCCE.很抱歉发布此帖子,因为现在您会对这个:x

Ladies and Gentleman... may I present... SSCCE. I am sorry to post this because now you will feel my pain with this :x

package com.jayavon.game.helper;

import javax.swing.*;
import java.awt.event.*;

public class SSCCE extends JFrame implements WindowListener {

    private static final long serialVersionUID = 1L;
    JFrame frame;
    JPanel panel;
    JButton characterButton;
    JInternalFrame characterFrame;
    /* Character Window */
    JProgressBar totalExpProgressBar;

    Action ClassCharacterButton = new ClassCharacterButton();

    public static void main(String[] args){
        //for thread safety     
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SSCCE();
            }
        });
    }

    SSCCE() {
        initGUI();
    }

    public void initGUI(){

        frame = new JFrame("SSCCE");
        panel = (JPanel)frame.getContentPane();

        /**********************************
         ** 
         **     Buttons
         **    
         *********************************/
        characterButton = new JButton("");
        characterButton.setBounds(50,175,395,100);
        characterButton.setVisible(true);
        characterButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("C"), "characterButtonPress");
        characterButton.getActionMap().put("characterButtonPress", ClassCharacterButton);
        characterButton.setAction(ClassCharacterButton);
        characterButton.setText("Click me three times(open/close/open) to get progress bar to fill");
        panel.add(characterButton);

        /**********************************
         ** 
         **     Internal Frames
         **    
         *********************************/
        //#### Character frame start ####
        characterFrame = new JInternalFrame("Character", true, true, false, false);
        characterFrame.setLocation(50, 50);
        characterFrame.setSize(300,105);

        totalExpProgressBar = new JProgressBar();
        totalExpProgressBar.setString("0/0");
        totalExpProgressBar.setStringPainted(true);

        characterFrame.add(totalExpProgressBar);
        characterFrame.setResizable(false);
        panel.add(characterFrame);
        //#### Character frame end ####

        /**********************************
         ** 
         **     Panel Code
         **    
         *********************************/
        panel.setLayout(null);
        panel.setFocusable(true);

        /**********************************
         ** 
         **     Frame Code
         **    
         *********************************/
        frame.setLocation(100, 100);
        frame.setSize(500, 350);
        frame.setVisible(true);
        frame.setFocusable(true);
        frame.addWindowListener(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    class ClassCharacterButton extends AbstractAction {  
        private static final long serialVersionUID = 1L;

        public void actionPerformed(ActionEvent e) {
            if (characterFrame.isVisible()){
                characterFrame.setVisible(false);
            } else {
                fakeGetServerResponse();
            }
        }
    }

    public void fakeGetServerResponse(){
        String incommingReply = "proskier-charactersWindow@20|10|10|10|0|234|3|200|400"; //fake message from server
        final String splitAt[] = incommingReply.split("@"); //split the character name from the incommingReply at the '@' sign
        String beforeAt[] = splitAt[0].split("-");
        String commandName = beforeAt[1];
        final String afterAt[] = splitAt[1].split("\\|");

        if (commandName.equals("charactersWindow")){
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    totalExpProgressBar.setString(afterAt[5] + "/" + afterAt[8]);
                    totalExpProgressBar.setMinimum(0);
                    totalExpProgressBar.setMinimum(Integer.parseInt(afterAt[7])); //TODO::SCREW YOU JAVA
                    totalExpProgressBar.setValue(Integer.parseInt(afterAt[5]));   //TODO::SCREW YOU JAVA
                    totalExpProgressBar.setMaximum(Integer.parseInt(afterAt[8])); //TODO::SCREW YOU JAVA
                    characterFrame.setVisible(true);
                }
            });
        }
    }

    @Override
    public void windowClosing(WindowEvent arg0){
        frame.dispose();
        System.exit(1);
    }
    @Override
    public void windowActivated(WindowEvent arg0) {
    }
    @Override
    public void windowClosed(WindowEvent arg0) {
    }
    @Override
    public void windowDeactivated(WindowEvent arg0) {
    }
    @Override
    public void windowDeiconified(WindowEvent arg0) {           
    }
    @Override
    public void windowIconified(WindowEvent arg0) {
    }
    @Override
    public void windowOpened(WindowEvent arg0) {            
    }
}

推荐答案

问题似乎是您在设置进度条的值后设置了进度条的最大值 ,这会将其重置为最小值.

The problem appears to be that you set the progress bar's maximal value after setting its value, and that this will reset the value to the minimum value.

import javax.swing.*;

public class ProgressBarMinValue {
   private static void createAndShowGui() {
      JProgressBar progressBar = new JProgressBar();

      int value = 234;
      int denominator = 400;
      int minValue = 200;
      progressBar.setString(value + "/" + denominator);
      progressBar.setMinimum(minValue);
      System.out.println("value := " + value);

      progressBar.setValue(value);  // (A)

      progressBar.setMaximum(denominator);

      // progressBar.setValue(value);  // (B)

      JPanel mainPanel = new JPanel();
      mainPanel.add(progressBar);

      JOptionPane.showMessageDialog(null, mainPanel);
      System.out.println("progressBar.getValue() := " + progressBar.getValue());
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

交换注释和取消注释行(A)和(B),如果在设置进度条的值 后将其设置为最小值和最大值,则一切正常.

Swap commenting and uncommenting lines (A) and (B) and see that all works well if you set the progress bar's value after setting its minimal and maximal value.

这就是您的解决方案.

请注意,我通过不断减少代码直到无法重现该问题来获得了最小的SSCCE.

Note that I obtained this minimal SSCCE by continuously whittling down your code until the problem could not be reproduced.

这篇关于JProgressBar绘画问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆