我正在使用JSlider来显示我的应用程序中的进度,以便它随着特定进程的计算而更新。
我希望用户过去能够将拇指向后拖动到刻度线,但是当发生这种情况时,我希望进度指示器保持在其当前位置。
// A dismal attempt at drawing the situation
Progress: ---------
Thumb: |
// User drags backwards. What I have:
Progress: ---
Thumb: |
// What I want instead:
Progress: ---------
Thumb: |
谁能提供有关如何最好地实现这一目标的指导?
在此先感谢您提供的所有帮助!
最佳答案
啊,我明白你的意思了。不幸的是,没有办法做到这一点。
“蓝色条”实际上并不是JSlider的一部分,它是Metal LAF的一部分,这只是Metal LAF选择为组件涂漆的方式,如果您尝试使用其他LAF,则根本无法获得该条。
您需要结合使用JProgressBar和JSlider来获得所需的内容。
这是一个起点。您需要对其进行调整以使其看起来正确
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.ChangeListener;
public class ProgressSlider extends javax.swing.JPanel
{
private JProgressBar progressBar;
private JSlider slider;
public ProgressSlider() {
this(0, 100);
}
public ProgressSlider(int min, int max) {
setLayout(new GridBagLayout());
GridBagConstraints gbc;
gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
slider = new JSlider(min, max, min);
progressBar = new JProgressBar(min, max);
add(slider, gbc);
add(progressBar, gbc);
}
public void setValue(int n) {
boolean adjSlider = slider.getValue() == progressBar.getValue();
progressBar.setValue(n);
if (adjSlider)
slider.setValue(n);
}
public int getValue() {
return progressBar.getValue();
}
public int getSliderValue() {
return slider.getValue();
}
public void syncSlider() {
slider.setValue(progressBar.getValue());
}
public void addChangeListener(ChangeListener l) {
slider.addChangeListener(l);
}
public void removeChangeListener(ChangeListener l) {
slider.removeChangeListener(l);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame jf = new JFrame();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final ProgressSlider ps = new ProgressSlider();
final JTextField tf = new JTextField(4);
final JButton jb = new JButton(new AbstractAction("Set") {
public void actionPerformed(ActionEvent e) {
ps.setValue(Integer.parseInt(tf.getText()));
}});
JPanel jp = new JPanel();
jp.add(tf);
jp.add(jb);
jf.getContentPane().add(ps, BorderLayout.CENTER);
jf.getContentPane().add(jp, BorderLayout.SOUTH);
jf.pack();
jf.setVisible(true);
}
});
}
}