ラベルと入力を含む GUI フォームを作成しています。各行にはラベルと入力があります。そのうちの 1 つは、入力 (開始時間と終了時間) に 2 つの 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 コンストラクターを使用してみて (そして、動作しないコードをコメントアウトして)、それらの結果を、このコードを完全に使用したときに得られる結果と比較してください。