0

これは、同じ問題に関する 2 つの質問のようなものです。完成すると次のようになるデジタル時計プロジェクトに取り組んでいます。

デジタル時計

1 つのフレームに 9 つのパネルがあります。クラス1コマ、TitlePanelクラス6コマ、クラスDigitPanel2コマColonPanel。私が抱えている問題はDigitPanelクラスにあります。現在、1 つのパネルのみを表示するようにコードを記述していますが、プログラムを実行すると、数字パネルが JFrame 全体を占有する必要があります。誰かが私に何が問題なのか教えてもらえますか?

メインクラス:

public class DigitalTimeUI extends JFrame {

    public DigitalTimeUI() {
        JFrame clock = new JFrame("Clock");
        clock.setSize(605, 250);

        clock.setDefaultCloseOperation(EXIT_ON_CLOSE);
        clock.setLocationRelativeTo(null);
        clock.setResizable(false);

        clock.add(new TitlePanel(), BorderLayout.NORTH);
        clock.add(new DigitPane(), BorderLayout.SOUTH);

        clock.pack();
        clock.setVisible(true);
    }

    public class DigitPane extends JPanel {

        DigitPanel[] hourDigit = new DigitPanel[]{new DigitPanel(), new DigitPanel()};
        DigitPanel[] minDigit = new DigitPanel[]{new DigitPanel(), new DigitPanel()};
        DigitPanel[] secDigit = new DigitPanel[]{new DigitPanel(), new DigitPanel()};
        private String hour = pad(Calendar.getInstance().get(Calendar.HOUR));
        private String min = pad(Calendar.getInstance().get(Calendar.MINUTE));
        private String sec = pad(Calendar.getInstance().get(Calendar.SECOND));
        private char[] hours = hour.toCharArray();
        private char[] minutes = min.toCharArray();
        private char[] seconds = sec.toCharArray();

        public DigitPane() {
            JLabel label = new JLabel();
            label.setFont(new Font("Tahoma", Font.BOLD, 72));
            label.setForeground(Color.WHITE);

            JPanel digitsPanel = new JPanel(new GridBagLayout());
            digitsPanel.setSize(new Dimension(605, 100));

            digitsPanel.add(new panelPadding());

            label.setText(String.valueOf(hours[0]));
            hourDigit[0].add(label);
            digitsPanel.add(hourDigit[0]);

            digitsPanel.add(new panelPadding());

            label.setText(String.valueOf(hours[1]));
            hourDigit[1].add(label);
            digitsPanel.add(hourDigit[1]);
            digitsPanel.add(new panelPadding());

            digitsPanel.add(new ColonPanel());
            digitsPanel.add(new panelPadding());

            label.setText(String.valueOf(minutes[0]));
            minDigit[0].add(label);
            digitsPanel.add(minDigit[0]);
            digitsPanel.add(new panelPadding());

            label.setText(String.valueOf(minutes[1]));
            minDigit[1].add(label);
            digitsPanel.add(minDigit[1]);
            digitsPanel.add(new panelPadding());

            digitsPanel.add(new ColonPanel());
            digitsPanel.add(new panelPadding());

            label.setText(String.valueOf(seconds[0]));
            secDigit[0].add(label);
            digitsPanel.add(secDigit[0]);
            digitsPanel.add(new panelPadding());

            label.setText(String.valueOf(seconds[1]));
            secDigit[0].add(label);
            digitsPanel.add(secDigit[1]);
            digitsPanel.add(new panelPadding());

            this.add(digitsPanel);
        }
    }

    protected String pad(int value) {
        StringBuilder sb = new StringBuilder(String.valueOf(value));
        while (sb.length() < 2) {
            sb.insert(0, "0");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        new DigitalTimeUI();
    }

    public class panelPadding extends JPanel {

        public panelPadding() {
            this.setPreferredSize(new Dimension(5, 80));
        }
    }
}

タイトルパネル:

public class TitlePanel extends JPanel {

    JLabel title;

    public TitlePanel() {
        this.setBackground(Color.WHITE);
        this.setPreferredSize(new Dimension(605, 100));
        this.setLayout(new GridBagLayout());
        title = new JLabel("DIGITAL CLOCK");
        title.setFont(new Font("Tahoma", Font.BOLD, 72));
        title.setForeground(Color.BLACK);
        this.add(title);
    }
}

桁パネル:

public class DigitPanel extends JPanel {

    public DigitPanel() {
        this.setLayout(new GridBagLayout());
        this.setPreferredSize(new Dimension(80, 80));
        this.setBackground(Color.BLACK);
    }
}

タイトル パネルは (何らかの理由で) サイズを変更してもフレーム全体を占有しませんが、数字パネルは占有し、その理由がわかりません。.setLocation().setLayout().setSize()、および他のいくつかのことを試しましたが、何も機能していないようです。

ここでおそらく答えることができる 2 番目の質問は、それぞれの数字パネルを作成するための最良の方法は何でしょうか? 前に while ループと switch ステートメントをいじっていましたが、対処した最初の問題に何度も遭遇したため、どこにもたどり着きませんでした。ありがとう。

4

1 に答える 1