我正在創建帶有標籤和輸入的GUI窗體。每一行都有一個標籤,然後是一個輸入。其中一個使用兩個JSpinners進行輸入(開始和結束時間)。這一切都很好,組件都很好地對齊,直到我添加一個SpinnerDateModel到spinners。雖然Spinner的大小已經足夠容納它的新內容,但它佔據了太多的空間(文本末尾和箭頭之間有很多空白)。我最初使用GridBagLayout,然後嘗試BoxLayout(每行都有一個帶有X軸BoxLayout的面板,全部在Y軸BoxLayout上),但是我得到了相同的結果。我找不到有關此特定問題的任何信息,但其他有關調整JSpinners大小的其他建議未奏效。我嘗試調整編輯器組件和JFormattedTextField的大小(包括使用setColumns()並檢查列已更改,它們具有)。我還能嘗試什麼?爲什麼添加SpinnerDateModel時,我的JSpinner調整大於所需的大小?
編輯:這裏是請求的SSCCE:
import java.awt.Dimension;
import java.util.Calendar;
import java.util.Date;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
public class SpinnerTest extends JPanel {
public static void main(String[] args) {
new SpinnerTest();
}
public SpinnerTest() {
JFrame mainFrame = new JFrame();
BoxLayout mainLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
setLayout(mainLayout);
JPanel titlePanel = new JPanel();
BoxLayout titleLayout = new BoxLayout(titlePanel, BoxLayout.X_AXIS);
titlePanel.setLayout(titleLayout);
JPanel timePanel = new JPanel();
BoxLayout timeLayout = new BoxLayout(timePanel, BoxLayout.X_AXIS);
timePanel.setLayout(timeLayout);
Calendar arb = Calendar.getInstance();
Date initDate = arb.getTime();
arb.add(Calendar.YEAR, -100);
Date earliestDate = arb.getTime();
arb.add(Calendar.YEAR, 200);
Date latestDate = arb.getTime();
SpinnerDateModel timeModel = new SpinnerDateModel(initDate, earliestDate,
latestDate, Calendar.MINUTE);
SpinnerDateModel timeModel2 = new SpinnerDateModel(initDate, earliestDate,
latestDate, Calendar.MINUTE);
JLabel titleLabel = new JLabel("Title:");
titleLabel.setPreferredSize(new Dimension(60, 16));
titlePanel.add(titleLabel);
JTextField titleField = new JTextField("Title");
titleField.setColumns(10);
titlePanel.add(titleField);
add(titlePanel);
JLabel timeLabel = new JLabel("Time:");
timeLabel.setPreferredSize(new Dimension(60, 16));
timePanel.add(timeLabel);
JSpinner startTime = new JSpinner(timeModel);
JComponent editor = (JSpinner.DefaultEditor) startTime.getEditor();
JFormattedTextField ftf = ((JSpinner.DefaultEditor) editor).getTextField();
ftf.setColumns(5);
ftf.setMaximumSize(new Dimension(50, 30));
editor.setMaximumSize(new Dimension(50, 30));
//System.out.println(tf.getColumns());
startTime.setEditor(new JSpinner.DateEditor(startTime, "HH:mm"));
timePanel.add(startTime);
JSpinner endTime = new JSpinner(timeModel2);
endTime.setMaximumSize(new Dimension(70, 20));
JComponent editor1 = (JSpinner.DefaultEditor) endTime.getEditor();
JFormattedTextField ftf1 = ((JSpinner.DefaultEditor) editor1).getTextField();
ftf1.setColumns(5);
ftf1.setMaximumSize(new Dimension(50, 30));
editor1.setMaximumSize(new Dimension(50, 30));
//System.out.println(ftf.getColumns());
endTime.setEditor(new JSpinner.DateEditor(endTime, "HH:mm"));
timePanel.add(endTime);
add(timePanel);
mainFrame.add(this);
mainFrame.pack();
mainFrame.setSize(189, mainFrame.getHeight());
mainFrame.setResizable(false);
mainFrame.setVisible(true);
}
}
我通常不會擴展JPanel,然後創建一個JFrame,但是我做的類放在一個預先存在的JFrame和擴展了JPanel,所以我正在追蹤我的儘可能接近。 我會強調BoxLayout不是我的第一選擇,我改變它知道它比大多數其他佈局更好地監聽.setXXXSize(我知道我不應該使用.setXXXSize,但我沒有看到如何排除它) 。 我已經嘗試了所有嘗試從研究問題中嘗試的嘗試,以免再次嘗試。 嘗試使用普通的JSpinner構造函數(並註釋掉不起作用的代碼),並將這些結果與完全使用此代碼時得到的結果進行比較。
發佈您的[SSCCE](http://sscce.org/)來證明問題。 – camickr