1

我正在创建带有标签和输入的 GUI 表单。每行都有一个标签,然后是一个输入。其中之一使用两个 JSpinner 进行输入(开始时间和结束时间)。一切都很好,并且组件都很好地对齐,直到我将 SpinnerDateModel 添加到微调器。尽管微调器的大小已经足够容纳它的新内容,但它会扩大占用太多空间(文本末尾和箭头之间有很多空白)。我最初使用的是 GridBagLayout,然后尝试了 BoxLayout(每一行都有一个带有 X 轴 BoxLayout 的面板,都在 Y 轴 BoxLayout 上),但我得到了相同的结果。我找不到有关此特定问题的任何信息,但有关调整 JSpinners 大小的所有其他建议均无效。一世' 我尝试调整编辑器组件和 JFormattedTextField 的大小(包括使用 setColumns() 并检查列是否已更改,它们已更改)。我还能尝试什么?

编辑:这是根据要求的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 构造函数(并注释掉不起作用的代码)并将这些结果与完全使用此代码时得到的结果进行比较。

4

1 回答 1

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 测试它,看看我的意思。

于 2013-04-13T02:20:09.810 回答