2013-04-12 43 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

相关问题