Java JSpinner:增加编辑器框的长度
我有一个JSpinner,它显示从0.0到999.0的十进制值。它似乎工作得很好,除了在编辑器框中显示一个四位数长的数字,如123.4;因为最后一个数字不够长,所以它会把它的一部分切掉 所以我的问题是:有人知道如何增加JSpinner编辑器窗口的长度吗Java JSpinner:增加编辑器框的长度,java,swing,user-interface,Java,Swing,User Interface,我有一个JSpinner,它显示从0.0到999.0的十进制值。它似乎工作得很好,除了在编辑器框中显示一个四位数长的数字,如123.4;因为最后一个数字不够长,所以它会把它的一部分切掉 所以我的问题是:有人知道如何增加JSpinner编辑器窗口的长度吗 谢谢 您可以通过 首先在JSpinner上调用getEditor(),以获取微调器的编辑器 将返回的对象强制转换为JSpinner.DefaultEditor 然后在此基础上调用getTextField()。然后,如果需要,您可以设置它的pre
谢谢 您可以通过
- 首先在JSpinner上调用
,以获取微调器的编辑器getEditor()
- 将返回的对象强制转换为
JSpinner.DefaultEditor
- 然后在此基础上调用
。然后,如果需要,您可以设置它的preferredSizegetTextField()
import java.awt.Dimension;
import javax.swing.*;
public class SpinnerBigTextField {
private static void createAndShowGui() {
JSpinner spinner = new JSpinner(new SpinnerNumberModel(0.0, 0.0, 999.0,
0.5));
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(300, 100));
panel.add(spinner);
JComponent field = ((JSpinner.DefaultEditor) spinner.getEditor());
Dimension prefSize = field.getPreferredSize();
prefSize = new Dimension(200, prefSize.height);
field.setPreferredSize(prefSize);
JFrame frame = new JFrame("SpinnerBigTextField");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
由于不同平台的
FontMetrics
有所不同,因此最好依靠组件自己对首选大小的计算。此示例显示了各种min
和max
值的JSpinner
大小范围。请特别注意,“允许每个组件假定其自然(首选)大小。”
导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入javax.swing.Box;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JSpinner;
导入javax.swing.SpinnerNumberModel;
/**@见http://stackoverflow.com/questions/7374659 */
公共类SpinnerTest扩展框{
专用静态最终双台阶=0.1d;
私有静态最终字符串格式=“0.0000000000”;
公共喷丝头测试(int轴){
超级(轴);
对于(int i=0;i<8;i++){
int v=(int)Math.pow(10,i);
添加(genParamPanel((i+1)+“:”,-v,v));
}
}
专用JPanel genParamPanel(字符串名称,双最小值,双最大值){
JPanel面板=新的JPanel(新的FlowLayout(FlowLayout.training));
JLabel label=新的JLabel(名称,JLabel.TRAILING);
JSpinner js=新JSpinner(新喷丝头编号模型(最小、最小、最大、步长));
setEditor(新的JSpinner.numberditor(js,格式));
面板。添加(标签);
panel.add(js);
返回面板;
}
专用void display(){
JFrame f=新JFrame(“喷丝头测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 加上(这个);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新喷丝头测试(BoxLayout.Y_轴).display();
}
});
}
}
第一艘气垫船的回答一点也不差。您不能直接更改大小,但可以执行以下操作:
JComponent editor = mySpinner.getEditor();
JFormattedTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
tf.setColumns(4);
您可以在其中定义编辑器显示的列编号。它将更改微调器的大小 更改微调器的最大值将增大文本框的大小以适应较大的数字。如果您不希望使最大值变大,我建议@JorgeHortelano建议的
JComponent editor=mySpinner.getEditor();
JFormattedTextField tf=((JSpinner.DefaultEditor)编辑器).getTextField();
tf.setColumns(4)
看,这是一个简单的答案。放置微调器的容器的布局是什么?一个An是理想的答案。我删除了我的答案,因为测试时答案是完全错误的。+1,它尊重首选尺寸,在这种情况下特别有用。@Hovercraft充满鳗鱼,不针对你的人,只是针对Rules从编辑器返回PreferredSize,在大多数情况下,我认为这正是程序员的工作,而不是LayoutManager的工作,如果我知道有4-5个数字拥有。。。或者可能的负号,还有另外5-8个像素水平方向和2-5个像素垂直方向的非难看外观,如何解决这一问题而不精确到JSpinner#setPreferredSize(),顺便说一句,从化合物中提取成分为1JComponent@Hovercraft全是鳗鱼:效果很好。谢谢我已经提出了一个依赖于组件首选大小的解决方案。非常感谢您提供了一个简单的三线示例!我到处找这个:)
JComponent editor = mySpinner.getEditor();
JFormattedTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
tf.setColumns(4);
JSpinner spn=new JSpinner();
spn.setPreferredSize(new Dimension(100,25));