Java 在Jpanel中使用JFrame对象
我有一个java类扩展了JFrame,它显示时间:Java 在Jpanel中使用JFrame对象,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我有一个java类扩展了JFrame,它显示时间: class Clock extends JFrame implements Runnable{ Thread runner; Font clockFont; 此代码显示一个数字时钟 public Clock() { super("Java clock"); setSize( 350, 100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(t
class Clock extends JFrame implements Runnable{
Thread runner;
Font clockFont;
此代码显示一个数字时钟
public Clock()
{
super("Java clock");
setSize( 350, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false);
clockFont = new Font("Serif", Font.BOLD, 40);
Container contentArea = getContentPane();
ClockPanel timeDisplay = new ClockPanel();
contentArea.add(timeDisplay);
setContentPane(contentArea);
start();
}
class ClockPanel extends JPanel
{
public void paintComponent(Graphics painter )
{
Image pic =
Toolkit.getDefaultToolkit().getImage("background.jpg");
if(pic != null){
painter.drawImage(pic, 0, 0, this);
painter.setFont(clockFont);
painter.setColor(Color.black);
painter.drawString( timeNow(), 60, 40);
}
}
public String timeNow()
{
Calendar now = Calendar.getInstance();
int hrs = now.get(Calendar.HOUR_OF_DAY);
int min = now.get(Calendar.MINUTE);
int sec = now.get(Calendar.SECOND);
String time = zero(hrs)+":"+zero(min)+":"+zero(sec);
return time;
}
public String zero(int num)
{
String number=( num < 10) ? ("0"+num) : (""+num);
return number;
}
public void start()
{
if(runner == null) runner = new Thread(this);
runner.start();
}
public void run()
{
while (runner == Thread.currentThread() )
{
repaint();
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
System.out.println("Thread failed");
}
}
}
现在我想在我的另一帧中显示JPanel中的时钟,我如何在JPanel中添加时钟类的对象
谢谢您的帮助。您不能在JPanel中放置时钟实例。那几乎没有道理 时钟是一个JFrame,所以在JPanel中放置JFrame是没有意义的 除非您正在寻找内部框架,否则: 然而,听起来更像是在另一个JFrame中的另一个JPanel中需要一个时钟面板 像这样的方法应该会奏效:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
panel.add(new ClockPanel());
jFrame.add(panel);
也就是说,除非执行这些代码行的类与类Clock不在同一个包中。
在这种情况下,将ClockPanel类公开。您可以将这部分代码作为时钟类:
现在我想..Tnx。。我想在一个技术论坛上看到的是,人们在拼写诸如“想”和“谢谢”之类的短语时花点功夫,并在句子开头使用shift键:但这不是我的答案!1为了更快地获得更好的帮助,请发布逻辑缩进的。2为什么有第二帧?对于这种情况,您可能需要一个模态对话框。3切勿在paintComponent方法中加载图像。将其加载到构造函数中,并将其声明为类属性,以便稍后在paint中使用。4使用ImageIO.read作为加载图像的阻塞方法。5使用Swing定时器调用repaint,而不是Runnable/Thread/sleep。但这不是我的确切答案!你挑吧。a这就是为什么我输入它作为一个评论,而不是一个答案。尽管这个问题缺乏重点,但这个答案毫无意义。非公共的“默认”类可以在同一包中的其他类中使用-1@AndrewThompson胡说我不能假设引用类在同一个包中。否则,无法引用默认/受保护类ClockPanel。此外,O.P.没有准确描述他/她遇到的问题,所以我拍了一张班级能见度的照片。编辑得好。否决票被删除+1用于指向tutorial.frame.setLayoutnull的链接;不必要的和脆弱的-1@AndrewThompson:可能他想手动设置位置和大小,所以他使用setLayoutnull!!!!!请不要给他投票,我认为这是不必要的和脆弱的!请注意,我想在技术论坛上看到的是人们在官方句子中使用**&**@AndrewThompson:请注意,这只是用法的示例!我想没必要投票否决我!!!可以吗?也许他想手动设置位置和大小,所以,他。。在自定义布局中实现该逻辑,并将该布局设置为父容器的布局。如果有问题的开发人员足够聪明,知道在不同的屏幕大小、PLAF、JRE版本、操作系统等中准确定位组件的位置。那么,在GUI中简单添加几个组件,最好使用通用布局,可能是组合使用。有关此问题的更多信息,请参阅Oracle论坛。
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.*;
import javax.swing.border.BevelBorder;
class Clock extends JLabel
{
Timer t = null;
//get current time
public String timeNow()
{
Calendar now = Calendar.getInstance();
int hrs = now.get(Calendar.HOUR_OF_DAY);
int min = now.get(Calendar.MINUTE);
int sec = now.get(Calendar.SECOND);
String time = zero(hrs)+":"+zero(min)+":"+zero(sec);
return time;
}
public String zero(int num)
{
String number=( num < 10) ? ("0"+num) : (""+num);
return number; //Add leading zero if needed
}
public Clock()
{
super();
setFont(new Font("Serif", Font.BOLD, 40)); //create font instance);
setBorder(new BevelBorder(1));
t = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DoChangeText();
}
});
t.start();
}
public void DoChangeText()
{
this.setText(timeNow());
}
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
frame.setLayout(null);
Clock c = new Clock();
c.setSize(250, 100);
c.setLocation(12, 100 );
frame.add(c);