2013-04-12 53 views
1

我正在創建帶有標籤和輸入的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構造函數(並註釋掉不起作用的代碼),並將這些結果與完全使用此代碼時得到的結果進行比較。

+1

發佈您的[SSCCE](http://sscce.org/)來證明問題。 – camickr

回答

3

我改變你的程序只使用一個FlowLayout,所以每個組件可以顯示在它的首選大小。格式化的文本字段大小可容納5個字符。它爲每個字符使用了11的寬度(這看起來有點過分),所以你會得到很多額外的空間。

在你的代碼,它看起來像您手動試圖控制的格式文本字段中的列數:

JSpinner startTime = new JSpinner(timeModel); 
    JComponent editor = (JSpinner.DefaultEditor) startTime.getEditor(); 
    JFormattedTextField ftf = ((JSpinner.DefaultEditor) editor).getTextField(); 
    ftf.setColumns(5); 
    startTime.setEditor(new JSpinner.DateEditor(startTime, "HH:mm")); 

問題是你訪問的格式文本字段,你改變編輯器前。相反,您需要在訪問格式化文本字段之前設置編輯器。

JSpinner startTime = new JSpinner(timeModel); 
    startTime.setEditor(new JSpinner.DateEditor(startTime, "HH:mm")); 
    JComponent editor = (JSpinner.DefaultEditor) startTime.getEditor(); 
    JFormattedTextField ftf = ((JSpinner.DefaultEditor) editor).getTextField(); 
    ftf.setColumns(3); 

我也將列更改爲3以減少額外的空白量。現在旋轉器的首選尺寸更合理。用FlowLayout進行測試以瞭解我的意思。

+0

setColumns()是我嘗試解決問題的一個嘗試,它不是我最初想要做的事情。我不需要更改爲FlowLayout,它在我移動setEditor行並減少列後工作。謝謝! – PatrickJBC

相關問題