Используйте объект JFrame в Jpanel - PullRequest
0 голосов
/ 03 января 2012

У меня есть класс в 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 в моем другом фрейме, как я могу добавить объект класса Clock в Jpanel?!

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 03 января 2012

Вы не можете поместить экземпляр Clock в JPanel. Это вряд ли имеет смысл!

Часы - это JFrame, и поэтому не имеет смысла помещать JFrame внутри JPanel.

(если вы не ищете Internal Frames): http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html

Однако, это звучит так, как будто вы хотите ClockPanel внутри другого JPanel, который находится в другом JFrame.

Примерно так должно работать:

JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
panel.add(new ClockPanel());
jFrame.add(panel);

То есть, если класс, из которого вы выполняете эти строки кода, не находится в том же пакете, что и класс Clock. В этом случае сделайте свой ClockPanel класс public.

0 голосов
/ 03 января 2012

Вы можете разместить эту часть кода как ваш Clock класс:

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 как следующий код:

    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);
...