Java 在对象之间传递数据对象的属性
目前我正试图用JAVA制作一个图形时钟,我正在处理元素之间的“通信”问题。实际上,我的架构在下面是可见的,由3个类组成: 抽屉被用作一个“容器”,它将与数据(只允许存储当前时间的时钟类)和图形(JFrame和clockPanel)相关的各种元素分组 ClockPanel类应该允许绘制时钟(目前我能够绘制静态元素,如下所示) 我的问题是如何将时钟数据传递到时钟面板以绘制时钟指针 我想把时钟传给时钟面板,但很明显,这不是一个可以选择的解决方案,它会使抽屉变得无用 所以我看不出如何在这两个元素之间建立联系。 我尽量保持干净,以便为将来获得最好的反应 我想了一会儿,我目前的结构是完全错误的,这导致了我的问题 以下是clockPanel抽屉和paintComponent功能的代码片段:Java 在对象之间传递数据对象的属性,java,swing,oop,object,graphics,Java,Swing,Oop,Object,Graphics,目前我正试图用JAVA制作一个图形时钟,我正在处理元素之间的“通信”问题。实际上,我的架构在下面是可见的,由3个类组成: 抽屉被用作一个“容器”,它将与数据(只允许存储当前时间的时钟类)和图形(JFrame和clockPanel)相关的各种元素分组 ClockPanel类应该允许绘制时钟(目前我能够绘制静态元素,如下所示) 我的问题是如何将时钟数据传递到时钟面板以绘制时钟指针 我想把时钟传给时钟面板,但很明显,这不是一个可以选择的解决方案,它会使抽屉变得无用 所以我看不出如何在这两个元素之间
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.timepackage中的类)。我知道它乍一看可能比手工制作的类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);
});
}
}