Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 标签数组的最后一个标签定位错误_Java_Arrays_Swing_Label - Fatal编程技术网

Java 标签数组的最后一个标签定位错误

Java 标签数组的最后一个标签定位错误,java,arrays,swing,label,Java,Arrays,Swing,Label,我正在尝试使用swing在Java中创建一个二进制时钟。 我在一开始就遇到了一个问题,标签数组的最后一个元素总是出现在0个X轴位置和y轴的中间。 我不想使用任何布局管理器,因为我希望我的面板上很少有圆形图像 以下是我目前的代码: import javax.swing.*; @SuppressWarnings("serial") public class MainFrame extends JFrame { public MainFrame() { setLayout(null);

我正在尝试使用swing在Java中创建一个二进制时钟。 我在一开始就遇到了一个问题,标签数组的最后一个元素总是出现在0个X轴位置和y轴的中间。 我不想使用任何布局管理器,因为我希望我的面板上很少有圆形图像

以下是我目前的代码:

import javax.swing.*;

@SuppressWarnings("serial")
public class MainFrame extends JFrame {

public MainFrame()
{
    setLayout(null);
    JFrame frame = new JFrame("Binary Clock");
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setSize(600,400);
    frame.setResizable(false);

    JLabel label[] = new JLabel[5];
    for(int i = 0; i < 5; i++)
    {
        label[i] = new JLabel();
        label[i].setLocation(i * 10, i * 10);
        label[i].setSize(30, 10);
        label[i].setText("TEST");
        frame.add(label[i]);
    }       
}

public static void main(String[] args)
{
    new MainFrame();
}
}
import javax.swing.*;
@抑制警告(“串行”)
公共类大型机扩展JFrame{
公共主机()
{
setLayout(空);
JFrame=新的JFrame(“二进制时钟”);
frame.setDefaultCloseOperation(关闭时退出);
frame.setVisible(true);
框架尺寸(600400);
frame.setresizeable(false);
JLabel标签[]=新JLabel[5];
对于(int i=0;i<5;i++)
{
label[i]=新的JLabel();
标签[i]。设置位置(i*10,i*10);
标签[i].setSize(30,10);
标签[i].setText(“测试”);
添加(标签[i]);
}       
}
公共静态void main(字符串[]args)
{
新主机();
}
}
我在这里发现了类似的问题:

但是没有布局管理器,就没有答案

我尝试过调整大小之类的事情,但只有setText()可以做任何改变,除此之外,其他都不起作用


谢谢大家!

> P>我不是Swing专家,所以我不知道会给你什么后果。代码> null <代码>布局管理器,但是从我记忆中,没有什么好的,所以考虑使用适当的布局管理器而不是<代码> null <代码>。 无论如何,您的问题似乎是由于您在当前由构造函数
实例初始化的
null
布局中设置了
布局,而不是在
表单
注册表中设置了实例

所以不是

setLayout(null);// represents this.setLayout(..), not frame.setLayout(..)
JFrame frame = new JFrame("Binary Clock");
使用


我也不知道为什么您的类会扩展JFrame。你的代码看起来并不像它需要任何来自JFrror的继承特征。

< P>我不是Swing专家,所以我不知道什么后果会给你<代码> NUL/<代码>布局管理器,但是从我所记得的没有什么好的,所以考虑使用适当的布局管理器而不是<代码> null <代码>。 无论如何,您的问题似乎是由于您在当前由构造函数
实例初始化的
null
布局中设置了
布局,而不是在
表单
注册表中设置了实例

所以不是

setLayout(null);// represents this.setLayout(..), not frame.setLayout(..)
JFrame frame = new JFrame("Binary Clock");
使用


我也不知道为什么您的类会扩展JFrame。您的代码实际上看起来不需要从JFrame继承任何功能。

Pshemo的答案提供了关于为什么添加最后一个标签会出现奇怪行为的答案,但我也用一些增强标记了代码

  • 删除
    扩展JFrame
    ,这很少是一个好主意,而且您已经了解了为什么在JFrame类中使用JFrame实例会导致

  • 将框架实例的布局设置为初始设置为null(而不是
    this
    )。注意:使用布局管理器是创建Swing UI的首选方法,通常不建议将其设置为
    null

  • 您不需要标签数组(除非您计划稍后使用它们),您可以使用循环添加所需的内容

  • 使框架最后可见

  • 那么你有:

    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class MainFrame {
    
        public MainFrame()
        {
            JFrame frame = new JFrame("Binary Clock");
            frame.setLayout(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600,400);
            frame.setResizable(false);
    
            for(int i = 0; i < 5; i++)
            {
                JLabel label = new JLabel();
                label.setLocation(i * 10, i * 10);
                label.setSize(30, 10);
                label.setText("TEST");
                frame.add(label);
            }
    
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            new MainFrame();
        }
    }
    
    import javax.swing.*;
    @抑制警告(“串行”)
    公共类主机{
    公共主机()
    {
    JFrame=新的JFrame(“二进制时钟”);
    frame.setLayout(空);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    框架尺寸(600400);
    frame.setresizeable(false);
    对于(int i=0;i<5;i++)
    {
    JLabel标签=新的JLabel();
    标签设置位置(i*10,i*10);
    标签。设置尺寸(30,10);
    label.setText(“测试”);
    框架。添加(标签);
    }
    frame.setVisible(true);
    }
    公共静态void main(字符串[]args)
    {
    新主机();
    }
    }
    
    Pshemo的回答提供了关于为什么添加最后一个标签后会出现奇怪行为的答案,但我也用一些增强标记了代码

  • 删除
    扩展JFrame
    ,这很少是一个好主意,而且您已经了解了为什么在JFrame类中使用JFrame实例会导致

  • 将框架实例的布局设置为初始设置为null(而不是
    this
    )。注意:使用布局管理器是创建Swing UI的首选方法,通常不建议将其设置为
    null

  • 您不需要标签数组(除非您计划稍后使用它们),您可以使用循环添加所需的内容

  • 使框架最后可见

  • 那么你有:

    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class MainFrame {
    
        public MainFrame()
        {
            JFrame frame = new JFrame("Binary Clock");
            frame.setLayout(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600,400);
            frame.setResizable(false);
    
            for(int i = 0; i < 5; i++)
            {
                JLabel label = new JLabel();
                label.setLocation(i * 10, i * 10);
                label.setSize(30, 10);
                label.setText("TEST");
                frame.add(label);
            }
    
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            new MainFrame();
        }
    }
    
    import javax.swing.*;
    @抑制警告(“串行”)
    公共类主机{
    公共主机()
    {
    JFrame=新的JFrame(“二进制时钟”);
    frame.setLayout(空);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    框架尺寸(600400);
    frame.setresizeable(false);
    对于(int i=0;i<5;i++)
    {
    JLabel标签=新的JLabel();
    标签设置位置(i*10,i*10);
    标签。设置尺寸(30,10);
    label.setText(“测试”);
    框架。添加(标签);
    }
    frame.setVisible(true);
    }
    公共静态void main(字符串[]args)
    {
    新主机();
    }
    }
    
    我不想使用任何布局管理器,因为我希望我的面板上很少有圆形图像

    Swing的核心设计是使用布局管理器,它描述了它的更新过程如何工作,以及它如何处理跨多个平台渲染管道的差异。当然,你可以尝试不使用它,但最终,你只需在尝试和补偿所有微不足道的crea问题时重新发明轮子