- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建带有标签和输入的 GUI 表单。每行都有一个标签,然后是一个输入。其中之一使用两个 JSpinners 进行输入(开始和结束时间)。一切都很好,组件都很好对齐,直到我将 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 构造函数(并注释掉不起作用的代码)并将这些结果与您完全使用此代码时得到的结果进行比较。
最佳答案
我将您的程序更改为仅使用 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 对其进行测试以了解我的意思。
关于java - 为什么在添加 SpinnerDateModel 时我的 JSpinner 会调整到比需要的更大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976856/
这是我的 Datespinner 代码 //DateOfBirth{ DateOfBirth = new JLabel("Date Of Birth (MM/DD/YYYY): ");
我正在尝试创建一个小时和分钟的 JSpinner 编辑器。 JSpinner 很简单 JSpinner startSpinner = new JSpinner(); SpinnerWindowMode
我想将更改后的值与 spinnerdatemodel 的当前日期之间的差值作为计时器的延迟。这是 JSpinner: Calendar cal = Calendar.getInstance(); ca
我正在尝试创建一个 JSpinner 以使用户能够选择日期。我希望有一个日期下限和一个日期上限。我还希望初始值是日期下限。不幸的是,我的问题是它不允许我使用下限作为初始值(JSpinner 根本没有响
我目前正在使用带有 JSpinner 的 SpinnerDateModel 在我的 java swing 应用程序中设置时间。下面是我的代码: shiftTime = new JSpinner(new
我发誓这太奇怪了。我制作了一个 Spinner,使用具有当前日期、无限制和 Calendar.MINUTE 单位的新 SpinnerDateModel 设置模型。 正如文档中所说: Creates a
我认为我的问题有一个简单的解决方案,但我是 Java 编程新手,所以我无法自己解决它,我有一个用作时间选择器的 jSpinner。我需要的是将这个 jSpinner 的值传递给一个字符串。请帮我做这件
我正在创建一个员工假释系统,其中包括接受加入日期。 我正在使用 swings 在 java 中创建一个界面。我希望用户在日期中设置微调器的值,并且程序必须能够获取用户选择的年月日。 我的员工对象由我创
我正在创建带有标签和输入的 GUI 表单。每行都有一个标签,然后是一个输入。其中之一使用两个 JSpinners 进行输入(开始和结束时间)。一切都很好,组件都很好对齐,直到我将 SpinnerDat
我正在使用 Swing 开发 Java 应用程序来创建 GUI。我的 JSpinner 有问题,它应该允许用户从特定范围内以 HH:mm 格式选择时间。我创建了自定义 SpinnerDateModel
我是一名优秀的程序员,十分优秀!