Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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_Swing_Oop_Object_Graphics - Fatal编程技术网

Java 在对象之间传递数据对象的属性

Java 在对象之间传递数据对象的属性,java,swing,oop,object,graphics,Java,Swing,Oop,Object,Graphics,目前我正试图用JAVA制作一个图形时钟,我正在处理元素之间的“通信”问题。实际上,我的架构在下面是可见的,由3个类组成: 抽屉被用作一个“容器”,它将与数据(只允许存储当前时间的时钟类)和图形(JFrame和clockPanel)相关的各种元素分组 ClockPanel类应该允许绘制时钟(目前我能够绘制静态元素,如下所示) 我的问题是如何将时钟数据传递到时钟面板以绘制时钟指针 我想把时钟传给时钟面板,但很明显,这不是一个可以选择的解决方案,它会使抽屉变得无用 所以我看不出如何在这两个元素之间

目前我正试图用JAVA制作一个图形时钟,我正在处理元素之间的“通信”问题。实际上,我的架构在下面是可见的,由3个类组成:

抽屉被用作一个“容器”,它将与数据(只允许存储当前时间的时钟类)和图形(JFrame和clockPanel)相关的各种元素分组

ClockPanel类应该允许绘制时钟(目前我能够绘制静态元素,如下所示)

我的问题是如何将时钟数据传递到时钟面板以绘制时钟指针

我想把时钟传给时钟面板,但很明显,这不是一个可以选择的解决方案,它会使抽屉变得无用

所以我看不出如何在这两个元素之间建立联系。 我尽量保持干净,以便为将来获得最好的反应

我想了一会儿,我目前的结构是完全错误的,这导致了我的问题

以下是clockPanel抽屉和paintComponent功能的代码片段:

public void initDraw() {
        clockWindow = new JFrame();

        clockWindow.setTitle(getTitle());//Définit un titre pour notre fenêtre
        clockWindow.setSize(getSize(), getSize());//Définit sa taille, elle sera carrée car deux fois size en W et H
        clockWindow.setLocationRelativeTo(null);//Nous demandons maintenant à notre objet de se positionner au centre
        clockWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Termine le processus lorsqu'on clique sur la croix rouge
        clockWindow.setResizable(false);//L'utilisateur ne peux pas redimensionner la fenetre
        clockWindow.setVisible(true);//Et enfin, la rendre visible

        clockPanel =  new ClockPanel(m_clock);
        clockWindow.setContentPane(clockPanel);

}
公共组件(图形g){
超级组件(g);
m_radiusWhiteCircle=(getWidth()/2)-40;//关于人造丝的颜色,关于玻璃的颜色
m_centerX=m_centerY=getWidth()/2;//事实上,事实上,事实上,事实上,事实上,这是一种高度上的分离(在变化中的分离)
System.out.println(getHeight());
这是一个挫折(新颜色(160196235));//关于défini le fond du JPanel
g、 setColor(Color.BLACK);//le prochaine cercle sera noir
int[]blackCircleSquare=convertCircleCoordsToSquareCoords(m_centerX,m_centerY,m_radiusWhiteCircle+10);//关于在非Cerre Cerre中使用的货币兑换器
g、 Fillova(blackCircleSquare[0],blackCircleSquare[1],blackCircleSquare[2],blackCircleSquare[2]);//关于fenetre和粘胶中心的建筑轮廓和“校长”的意见
g、 setColor(Color.WHITE);//白血球血清
int[]whiteCircleSquare=convertCircleCoordsToSquareCoords(m_centerX、m_centerY、m_radiusWhiteCircle);
g、 fillOval(whiteCircleSquare[0],whiteCircleSquare[1],whiteCircleSquare[2],whiteCircleSquare[2]);
g、 setColor(Color.GREEN);
int[]greenCircleSquare=convertCircleCoordsToSquareCoords(m_centerX,m_centerY,10);
g、 fillOval(greenCircleSquare[0],greenCircleSquare[1],greenCircleSquare[2],greenCircleSquare[2]);
g、 setColor(Color.RED);
g、 setFont(新字体(“TimeRoman”,普通字体,20));

对于(inti=1;i,我认为,以下步骤:

  • 您可以使用已经存在的类进行时间处理(java.time
    package中的类)。我知道它乍一看可能比手工制作的类
    Clock
    更复杂,但它有更大的潜力。从长远来看,您可能会被迫了解它,因为您需要这种潜力。我们有更多的机会让将来维护我们代码的其他人了解现有的API,而不是我们自己的手工API而且,通过现在学习,你也可以现在就开始使用它
  • 至于类图,我认为可以说对象是:时间、时间的图形表示和窗口(具有时间的图形表示)。因此,这将导致我将
    图标子类化,对于时间的图形表示,使用已经存在的时间处理类(或者仅当它们不存在时才创建它们),最后是窗口(已存在为
    JFrame
  • 那么,如何通过
    JLabel
    向窗口提供
    图标
  • 然后创建一个
    Timer
    对象,以便每隔一段时间(根据需要)更新
    JLabel
    的时钟图标/表示
  • 下面是演示代码的示例:

    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.time.LocalTime;
    import javax.swing.Icon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class Main {
    
        public static class ClockIcon implements Icon {
            @Override
            public void paintIcon(final Component c, final Graphics g, final int x, final int y) {
                //The clock's painting goes here...
                g.fillOval(x, y, getIconWidth() - 1, getIconHeight() - 1);
                g.setColor(Color.CYAN.darker());
                g.drawString(LocalTime.now().toString(), x + 14, y + 5 + getIconHeight() / 2);
            }
    
            @Override
            public int getIconWidth() {
                return 100; //The clock's width goes here...
            }
    
            @Override
            public int getIconHeight() {
                return 100; //The clock's height goes here...
            }
        }
    
        public static void main(final String[] args) {
            SwingUtilities.invokeLater(() -> {
    
                final JLabel label = new JLabel(new ClockIcon(), SwingConstants.CENTER);
    
                final Timer engine = new Timer(500, e -> label.repaint());
                engine.setRepeats(true);
                engine.start();
    
                final JFrame frame = new JFrame("Clock");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            });
        }
    }
    
    对于如何使用时间类的简单教程,我建议。如果你更好奇,你可以从软件包的文档开始

    希望能有帮助


    一些注意事项:我建议您不要急于接受一个/我的答案,如果它对您的帮助没有达到您想要的程度。请随时在评论中首先要求澄清,或者只需等待更多时间,让更多知名人士回答您的问题。我的意见是,在您的情况下,您没有复杂的类图可以使用:只需子类化
    图标
    ,并将其交给
    JLabel
    计时器
    。最后,我要说的是,在问题中发布一个你尝试过的内容,有助于获得更好的答案。

    感谢你对解决方案的巨大响应!!我将饶有兴趣地观看它,评估并尝试一些事情!感谢所有的支持您在这里提供的建议!谢谢!另一件需要注意的事情是,我测试了建议的解决方案,计时器延迟等于1000ms(1秒)为了准确地每1秒更新一次,但每次打印时间的毫秒数表明准确的1秒是不够的。计时器的延迟应该小于1秒,以说明计时器的操作侦听器本身以及重新绘制所引入的额外延迟。这就是为什么如果在我的ex中看到计时器的延迟充裕度为500ms,不接近1000。
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.time.LocalTime;
    import javax.swing.Icon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class Main {
    
        public static class ClockIcon implements Icon {
            @Override
            public void paintIcon(final Component c, final Graphics g, final int x, final int y) {
                //The clock's painting goes here...
                g.fillOval(x, y, getIconWidth() - 1, getIconHeight() - 1);
                g.setColor(Color.CYAN.darker());
                g.drawString(LocalTime.now().toString(), x + 14, y + 5 + getIconHeight() / 2);
            }
    
            @Override
            public int getIconWidth() {
                return 100; //The clock's width goes here...
            }
    
            @Override
            public int getIconHeight() {
                return 100; //The clock's height goes here...
            }
        }
    
        public static void main(final String[] args) {
            SwingUtilities.invokeLater(() -> {
    
                final JLabel label = new JLabel(new ClockIcon(), SwingConstants.CENTER);
    
                final Timer engine = new Timer(500, e -> label.repaint());
                engine.setRepeats(true);
                engine.start();
    
                final JFrame frame = new JFrame("Clock");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            });
        }
    }