我有一個顯示從0.0到999.0的十進制值的JSpinner。它似乎工作正常,除了當它在四位數的編輯框中顯示一個數字時,例如123.4;然後它會切斷最後一位數字的一部分,因爲它不夠長。JSpinner:增加編輯框的長度
所以我的問題是:有誰知道如何增加JSpinner編輯器窗口的長度?
謝謝!
我有一個顯示從0.0到999.0的十進制值的JSpinner。它似乎工作正常,除了當它在四位數的編輯框中顯示一個數字時,例如123.4;然後它會切斷最後一位數字的一部分,因爲它不夠長。JSpinner:增加編輯框的長度
所以我的問題是:有誰知道如何增加JSpinner編輯器窗口的長度?
謝謝!
你可以得到的文本字段這實際上是一個由
getEditor()
得到微調的編輯JSpinner.DefaultEditor
getTextField()
JFormattedTextField
在這。然後,如果需要,您可以將其設置爲preferredSize。編輯:正如trashgod所指出的那樣,使用正確的佈局是至關重要的,並確保您使用的佈局最好可能是解決此問題的最佳方法。
編輯2:以上是錯誤的,因爲設置文本字段的首選大小什麼也不做。但是,您可以設置編輯器本身的首選大小,並且可以工作。如,
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();
}
});
}
}
+1 ['BoxLayout'](http://download.oracle.com/javase/7/docs/api/javax/swing/BoxLayout.html)尊重首選尺寸,在這種情況下特別有用。 – trashgod
@Hovercraft完整的鰻魚不會agaist你的人,只是針對rulles返回編輯器中的PreferredSize,在大多數情況下,我認爲這對於Programator而言並不適用於LayoutManager,如果我知道有4-5個數字possitions ...或可能負數字符號,還有更多的加5-8像素水平和2-5垂直爲非醜陋的樣子,如何解決,沒有完全對JSpinner#setPreferredSize(),btw +1提取複合成分JComponent – mKorbel
-1對於setXXSize – kleopatra
由於FontMetrics
變化從一個平臺到下一個,最好是依靠組件自己的首選大小的計算。此示例顯示了各種min
和max
值的JSpinner
大小的頻譜。特別要注意的是,FlowLayout
「讓每個組件都採用其自然(首選)大小。」
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
/** @see http://stackoverflow.com/questions/7374659 */
public class SpinnerTest extends Box {
private static final double STEP = 0.1d;
private static final String FORMAT = "0.0000000000";
public SpinnerTest(int axis) {
super(axis);
for (int i = 0; i < 8; i++) {
int v = (int) Math.pow(10, i);
this.add(genParamPanel((i + 1) + ":", -v, v));
}
}
private JPanel genParamPanel(String name, double min, double max) {
JPanel panel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
JLabel label = new JLabel(name, JLabel.TRAILING);
JSpinner js = new JSpinner(new SpinnerNumberModel(min, min, max, STEP));
js.setEditor(new JSpinner.NumberEditor(js, FORMAT));
panel.add(label);
panel.add(js);
return panel;
}
private void display() {
JFrame f = new JFrame("SpinnerTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new SpinnerTest(BoxLayout.Y_AXIS).display();
}
});
}
}
第一氣墊船的答案是不壞。你不能直接改變尺寸,但你可以這樣做:
JComponent editor = mySpinner.getEditor();
JFormattedTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
tf.setColumns(4);
你可以在哪裏定義編輯器顯示的列數。它會改變微調器的大小。
非常感謝您提供簡單的3行示例!我一直在尋找這個:) – uyuyuy99
不適合我。 –
@ ivan.ukr感謝downvote。我在許多應用程序中執行這個代碼,它正在工作。你確定這個錯誤是在這些行嗎? – JorgeHortelano
更改微調器的最大值將增加文本框的大小以容納大數字。如果你不希望使最大值更大,我會推薦什麼@JorgeHortelano建議...
JComponent的編輯器= mySpinner.getEditor(); JFormattedTextField tf =((JSpinner.DefaultEditor)editor).getTextField(); tf.setColumns(4);
放置微調器的容器的佈局是什麼?一個[sscce](http://sscce.org/)將是理想的。 – trashgod
我刪除了我的答案,因爲測試時顯然是錯誤的。 –