我正在寻找一个类似JSpinner的组件,它会提供内置按钮,可以立即将微调器值设置为jspinner模型的最小值或最大值。在我自己实现这个之前,我认为有人可能以前做过,虽然我对谷歌搜索的主题没有成功。
那里有这样的组件,还是我应该自己编写代码?谢谢你的帮助。
答案 0 :(得分:2)
我想不出任何可以开箱即用的组件。但基本上,一个带有减号按钮,微调器和最大按钮的简单流程布局就可以了。这两个按钮都有actionListeners
,它会向微调器询问最小值和最大值并设置其值。
使用微调器上的changeListener以编程方式(使用按钮)和用户交互通知值更改。
另外,如果你的值是离散的,你可以考虑使用JCombobox,如果不是,你可以考虑使用JSlider,因为两个组件都更清楚地向用户显示上限和下限。
此致 斯特凡
答案 1 :(得分:2)
我认为自己实施它会很简单
1)我会创建一个扩展JPanel的类。
class MyPanel extends JPanel
2)在这个课程中,您必须定义滑块和按钮的放置位置以及与按钮相关的操作。
public MyPanel(){
super();
// set the layout
JSlider slider = new Slider();
this.add(slider);
// ..
JButton button1 = new JButton();
//
}
3)您可以向您的应用程序添加已实现的类的JPanel实例。
答案 2 :(得分:2)
您必须阅读How to Use Spinners,然后您才能为SpinnerNumberModel
准确设置这些值JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1));
例如(作者StanislavL)
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.text.*;
public class TestDigitsOnlySpinner {
public static void main(String... args) {
SwingUtilities.invokeLater((Runnable) new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("enter digit");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JSpinner jspinner = makeDigitsOnlySpinnerUsingDocumentFilter();
frame.getContentPane().add(jspinner, BorderLayout.CENTER);
frame.getContentPane().add(new JButton("just another widget"), BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
private JSpinner makeDigitsOnlySpinner_BasicAttempt() {
JSpinner spinner = new JSpinner(new SpinnerNumberModel());
return spinner;
}
private JSpinner makeDigitsOnlySpinnerUsingDocumentFilter() {
JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1));
JSpinner.NumberEditor jsEditor = (JSpinner.NumberEditor) spinner.getEditor();
final Document jsDoc = jsEditor.getTextField().getDocument();
if (jsDoc instanceof PlainDocument) {
AbstractDocument doc = new PlainDocument() {
private static final long serialVersionUID = 1L;
@Override
public void setDocumentFilter(DocumentFilter filter) {
if (filter instanceof MyDocumentFilter) {
super.setDocumentFilter(filter);
}
}
};
doc.setDocumentFilter(new MyDocumentFilter());
jsEditor.getTextField().setDocument(doc);
}
return spinner;
}
});
}
private static class MyDocumentFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
if (stringContainsOnlyDigits(string)) {
super.insertString(fb, offset, string, attr);
}
}
@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
super.remove(fb, offset, length);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if (stringContainsOnlyDigits(text)) {
super.replace(fb, offset, length, text, attrs);
}
}
private boolean stringContainsOnlyDigits(String text) {
for (int i = 0; i < text.length(); i++) {
if (!Character.isDigit(text.charAt(i))) {
return false;
}
}
return true;
}
}
private TestDigitsOnlySpinner() {
}
}