如何将JLabel保留在JProgressbar上

Mir*_*lib 0 java swing layout-manager null-layout-manager

这是我的java代码的一部分,在这段代码中,我希望进度条应始终保留在标签下(标签的后面),当我启动程序时进度条位于标签下,但进度条出现/当我点击按钮并开始进度时,在标签上.那么请告诉我如何将标签始终保持在进度条上???

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;


public class Test {

    JFrame frame = new JFrame();
    JLabel label = new JLabel();
    JProgressBar bar = new JProgressBar(JProgressBar.VERTICAL,0,100);
    JButton button = new JButton();

    public static void main(String arg[]) {
        new Test();
    }

    public Test() {
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.setLayout(null);
        label.setOpaque(true);
        label.setBackground(Color.BLACK);
        label.setBounds(100,100,100,50);
        bar.setBounds(140,25,20,200);
        button.setBounds(220,100,50,50);
        button.addActionListener(new Progress());
        frame.add(label);
        frame.add(bar);
        frame.add(button);
        frame.setVisible(true);
    }

    class Progress extends SwingWorker<Void, Void> implements ActionListener {

        public Void doInBackground() {
            for(int i=0; i<101; i++) {
                bar.setValue(i);
                try {
                    Thread.sleep(100);
                } 
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

        public void actionPerformed(ActionEvent e) {
            this.execute();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Mad*_*mer 5

我不知道为什么你要做的就是你JProgressBar已经提供了显示String价值的方法......

查看JProgressBar#setStringPainted更多详情......

进展

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ProgressBarTest {

    public static void main(String[] args) {
        new ProgressBarTest();
    }

    public ProgressBarTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {            
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                JProgressBar pb = new JProgressBar();
                pb.setValue(0);
                pb.setStringPainted(true);
                pb.setString("Look ma, no hands");
                frame.add(pb);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                SwingWorker worker = new SwingWorker() {
                    @Override
                    protected Object doInBackground() throws Exception {
                        for (int index = 0; index < 1000; index++) {
                            int progress = (int)Math.round((index / 1000f) * 100);
                            setProgress(progress);
                            Thread.sleep(10);
                        }
                        return null;
                    }
                };

                worker.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        if ("progress".equals(evt.getPropertyName())) {
                            int value = (int) evt.getNewValue();
                            System.out.println(value);
                            pb.setValue(value);
                        }
                    }
                });

                worker.execute();

            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

更新

现在,如果你"真的"想要在进度条上放置一个标签,你可以做一些技巧,例如...

进展

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ProgressBarTest {

    public static void main(String[] args) {
        new ProgressBarTest();
    }

    public ProgressBarTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JLabel label = new JLabel("I feel the need for speed");
                JProgressBar pb = new JProgressBar();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.weightx = 1;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.ipady = 20;

                frame.add(pb, gbc);

                gbc.weightx = 0;
                gbc.fill = GridBagConstraints.NONE;
                gbc.insets = new Insets(5, 0, 5, 0);
                frame.add(label, gbc);


                frame.add(pb, gbc);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                SwingWorker worker = new SwingWorker() {
                    @Override
                    protected Object doInBackground() throws Exception {
                        for (int index = 0; index < 1000; index++) {
                            int progress = (int) Math.round((index / 1000f) * 100);
                            setProgress(progress);
                            Thread.sleep(10);
                        }
                        return null;
                    }
                };

                worker.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        if ("progress".equals(evt.getPropertyName())) {
                            int value = (int) evt.getNewValue();
                            System.out.println(value);
                            pb.setValue(value);
                        }
                    }
                });

                worker.execute();

            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

基本上,这将标签和进度条放在GridBagLayout... 内的同一位置