将多个面板放入JFrame的问题

时间:2013-03-12 00:34:57

标签: java swing

这是关于同一问题的两个问题。我正在研究一个数字时钟项目,完成后将会是这样的:

digital clock

一帧中有9个面板。 TitlePanel类的一个面板,DigitPanel类的6个面板和ColonPanel类的2个面板。我遇到的问题是DigitPanel类。我编写的代码现在只显示一个面板,但数字面板想要在运行程序时占用整个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));
        }
    }
}

TitlePanel:

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);
    }
}

DigitPanel:

public class DigitPanel extends JPanel {

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

标题面板(无论出于何种原因)在调整大小时不占用整个帧,但是数字面板确实如此,我不知道为什么。我尝试了.setLocation().setLayout().setSize()以及其他一些内容,但似乎没有任何效果。

这里可能会回答的第二个问题是,创建每个数字面板的最佳方法是什么?我之前正在玩一个while循环和一个switch语句,但没有到达任何地方,因为我一直遇到我解决的第一个问题。感谢。

1 个答案:

答案 0 :(得分:3)

BorderLayout有5个不同的区域可以添加组件。默认情况下,如果您未指定位置,则会将组件添加到CENTER位置。

在你的代码中你正在这样做......

clock.setLayout(new BorderLayout());
clock.add(new TitlePanel())
clock.add(new DigitPanel()).setLocation(5, 125);

这基本上将TitlePane替换为DigitialPanel,这意味着TitlePane将不会显示。

此外,使用setLocation不仅毫无意义(因为一旦重新验证面板后该值将被丢弃),但也不鼓励。

我愿意;

  1. TitlePanel添加到NORTH位置(clock.add(new TitlePane(), BorderLayout.NORTH))
  2. 创建另一个JPanel(类似于digitsPanel)并设置为使用GridLayout,类似于(digitsPanel.setLayout(new GridLayout(1, 8)))。
  3. 将每个DigitalPane添加到digitsPanel(包括冒号)
  4. digitsPanel添加到CENTER - clock的{​​{1}}位置 - clock.add(digitsPanel)
  5. 唯一的问题是每个面板(在digitsPanel上)都是相同的尺寸。

    如果这不符合您的需求,如果您需要更多地控制布局,我建议您使用FlowLayoutGridBagLayout

    <强>更新

    DigitPane[] hourDigit = new DigitPane[]{new DigitPane(), new DigitPane()};
    DigitPane[] minDigit = new DigitPane[]{new DigitPane(), new DigitPane()};
    DigitPane[] secDigit = new DigitPane[]{new DigitPane(), new DigitPane()};
    
    JPanel digitsPanel = new JPanel(new GridBagLayout());
    digitsPanel.add(hourDigit[0]);
    digitsPanel.add(hourDigit[1]);
    digitsPanel.add(new ColonPane());
    digitsPanel.add(minDigit[0]);
    digitsPanel.add(minDigit[1]);
    digitsPanel.add(new ColonPane());
    digitsPanel.add(secDigit[0]);
    digitsPanel.add(secDigit[1]);