Java 在Jpanel中使用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

我有一个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(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);