Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多个面板放入JFrame中的问题_Java_Swing - Fatal编程技术网

Java 将多个面板放入JFrame中的问题

Java 将多个面板放入JFrame中的问题,java,swing,Java,Swing,这是关于同一问题的两个问题。我正在做一个数字时钟项目,完成后会是这样: 一个框架中有9个面板。标题面板类的一个面板,数字面板类的6个面板,以及ColonPanel类的2个面板。我遇到的问题是DigitPanel类。我现在编写的代码只显示一个面板,但是数字面板希望在我运行程序时占据整个JFrame。有人能告诉我是什么问题吗 主类: public class DigitalTimeUI extends JFrame { public DigitalTimeUI() { J

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

一个框架中有9个面板。
标题面板
类的一个面板,数字面板类的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));
        }
    }
}
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()
,以及其他一些方法,但似乎没有任何效果


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

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

在您的代码中,您正在这样做

clock.setLayout(new BorderLayout());
clock.add(new TitlePanel())
clock.add(new DigitPanel()).setLocation(5, 125);
这基本上是将
标题栏
替换为
数字标题栏
,这意味着
标题栏
将不会显示

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

我愿意

  • TitlePanel
    添加到
    NORTH
    位置(
    clock.Add(new TitlePane(),BorderLayout.NORTH))
  • 创建另一个
    JPanel
    (类似
    digitsPanel
    )并设置为使用
    GridLayout
    ,类似(
    digitsPanel.setLayout(新的GridLayout(1,8))
  • 将每个
    数字窗格
    添加到
    数字面板
    (包括冒号)
  • digitsPanel
    添加到
    clock
    -
    clock的
    CENTER
    位置。添加(digitsPanel)
  • 唯一的问题是,每个面板(在
    digitsPanel
    上)的大小都相同

    如果这不能满足您的需要,我建议您使用
    FlowLayout
    gridbagloayout
    ,如果您需要对布局进行更多控制

    已更新

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

    BorderLayout
    有5个可添加组件的不同区域。默认情况下,如果未指定位置,则零部件将添加到
    中心位置

    在您的代码中,您正在这样做

    clock.setLayout(new BorderLayout());
    clock.add(new TitlePanel())
    clock.add(new DigitPanel()).setLocation(5, 125);
    
    这基本上是将
    标题栏
    替换为
    数字标题栏
    ,这意味着
    标题栏
    将不会显示

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

    我愿意

  • TitlePanel
    添加到
    NORTH
    位置(
    clock.Add(new TitlePane(),BorderLayout.NORTH))
  • 创建另一个
    JPanel
    (类似
    digitsPanel
    )并设置为使用
    GridLayout
    ,类似(
    digitsPanel.setLayout(新的GridLayout(1,8))
  • 将每个
    数字窗格
    添加到
    数字面板
    (包括冒号)
  • digitsPanel
    添加到
    clock
    -
    clock的
    CENTER
    位置。添加(digitsPanel)
  • 唯一的问题是,每个面板(在
    digitsPanel
    上)的大小都相同

    如果这不能满足您的需要,我建议您使用
    FlowLayout
    gridbagloayout
    ,如果您需要对布局进行更多控制

    已更新

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

    我不确定BorderLayout是否最适合您使用。我建议您查看有关标准API中所有布局管理器的更多信息。如果坚持使用BorderLayout,请从此处开始:。请特别注意BorderLayout是如何划分窗口的。@代码大师感谢您的链接。由此看来,网格或网格包是最好的,是吗?@darthththulhu
    GridLayout
    将确保单元格中的每个元素大小相同。这可能适合您的需要,因为您可能不希望冒号组件的大小相同。如果你这样做了,那么是的,它将完美地工作。请注意,你不仅限于使用一种布局,甚至一种。可以使用几个JPanel嵌套它们。使用GridbagLayout,您完全可以随心所欲。您也可以使用嵌套的BoxLayouts来完成此操作。我不确定哪一个需要更少的工作。我不确定BorderLayout是否最适合您使用。我建议您查看有关标准API中所有布局管理器的更多信息。如果坚持使用BorderLayout,请从此处开始:。请特别注意BorderLayout是如何划分窗口的。@代码大师感谢您的链接。由此看来,网格或网格包是最好的,是吗?@darthththulhu
    GridLayout
    将确保单元格中的每个元素大小相同。这可能适合您的需要,因为您可能不希望冒号组件的大小相同。如果你这样做了,那么是的,它将完美地工作。请注意,你不仅限于使用一种布局,甚至一种。可以使用几个JPanel嵌套它们。使用GridbagLayout,您完全可以随心所欲。您也可以使用嵌套的BoxLayouts来完成此操作。我不确定哪一个需要更少的工作。好吧,我在GridbagLayouts上找到的所有东西都是在一个面板中使用它们。什么