2013-03-11 1 views
1

Я сделать цифровые часы для проекта и у меня есть четыре класса: DigitalTimeUI, что является JFrame класс, TitlePanel, DigitPanel и ColonPanel, которые JPanels для элемента указано. Когда она будет закончена, она должна выглядеть следующим образом:Создание цифровых часов в Java

enter image description here

Та часть я застрял на это добавление DigitPanel S к раме в классе UI. Вот что у меня есть в главном классе прямо сейчас:

public class DigitalTimeUI extends JFrame { 

public static GregorianCalendar currentDate; 
final static int CLOCKWIDTH = 605; 
final static int CLOCKHEIGHT = 200; 

public static void main(String[] args) { 
    int numOfDigits = 6; 
    int startingX = 0; 
    int startingY = 0; 

    Font clockFont = new Font("Tahoma", Font.BOLD, 72); 
    JFrame clock = new JFrame(); 

    clock.setSize(CLOCKWIDTH, CLOCKHEIGHT); 
    clock.setVisible(true); 
    clock.setResizable(false); 
    clock.setDefaultCloseOperation(EXIT_ON_CLOSE); 

    TitlePanel titlePanel = new TitlePanel(); 
    JLabel title = new JLabel("DIGITAL CLOCK"); 
    title.setFont(clockFont); 
    title.setForeground(Color.BLACK); 
    titlePanel.add(title); 
    clock.add(titlePanel); 

    DigitPanel digitPanel = new DigitPanel(); 
    JLabel digit; 
    startingY = 115; 
    while (numOfDigits > 0) { 
     if ((numOfDigits % 2) == 0) { 
      startingX += 5; 
      digit = new JLabel(String.valueOf(0)); 

     } 

    } 
    } 
} 

Код рода беспорядок прямо сейчас, я все еще есть некоторые очистки, чтобы сделать после того, как я понимаю, что последняя часть выяснили. Эта нижняя часть - это всего лишь отходы от моих попыток отобразить 6-значные поля. Я думаю, что основная проблема, с которой я сталкиваюсь, - найти способ разделить время, возвращенное с GregorianCalendar, и поместить их в 6 разных ящиков, а затем - эффективный способ поместить их в фрейм с помощью цикла while или whatnot.

Чтобы уточнить: Вышеуказанная фотография была предоставлена ​​мне инструктором в качестве ориентира, который можно использовать при форматировании моих часов. В нем также имеется 9 панелей. «ЦИФРОВОЕ ВРЕМЯ» представляет собой панель класса TitlePanel. Ящики с цифрами относятся к классу DigitPanel и их 6. Коробки с двоеточиями имеют класс ColonPanel и их два. Проблема, с которой я столкнулась, состоит в том, чтобы разделить время на 6 разных ящиков. Например, когда изображение показывает «48», мне нужен способ принять значение от GregorianCalendar.MINUTE или что угодно и разбить его на 4 и 8, чтобы поместить в каждый из этих ящиков. Благодарю.

+4

Каков ваш вопрос? – beny23

+1

Возможно, вы захотите использовать несколько панелей, чтобы вы могли вставлять макеты, чтобы получить правильный внешний вид вашего пользовательского интерфейса. –

+0

@ beny23 Мой вопрос в том, как я могу разделить время на 6 панелей с помощью 'GregorianCalendar' – 2013-03-11 15:47:14

ответ

3

Если я правильно понял вопрос правильно ...

Вы работаете в среде ОО. Вы должны разбить свой дизайн на наименьшие управляемые единицы работы, как вы можете.

Для меня это означает, что каждая цифра (или единица измерения времени) является наименьшей единицей работы. Для этого потребуется компонент, который просто способен отображать значение с добавленным значением 0.

Оттуда вы можете создать его на панели часов, используя 3-значные панели, как показано на рисунке.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Calendar; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DigitalClock { 

    public static void main(String[] args) { 
     new DigitalClock(); 
    } 

    public DigitalClock() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private DigitPane hour; 
     private DigitPane min; 
     private DigitPane second; 
     private JLabel[] seperator; 

     private int tick = 0; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 

      hour = new DigitPane(); 
      min = new DigitPane(); 
      second = new DigitPane(); 
      seperator = new JLabel[]{new JLabel(":"), new JLabel(":")}; 

      add(hour); 
      add(seperator[0]); 
      add(min); 
      add(seperator[1]); 
      add(second); 

      Timer timer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Calendar cal = Calendar.getInstance(); 
        hour.setValue(cal.get(Calendar.HOUR_OF_DAY)); 
        min.setValue(cal.get(Calendar.MINUTE)); 
        second.setValue(cal.get(Calendar.SECOND)); 

        if (tick % 2 == 1) { 
         seperator[0].setText(" "); 
         seperator[1].setText(" "); 
        } else { 
         seperator[0].setText(":"); 
         seperator[1].setText(":"); 
        } 
        tick++; 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

    } 

    public class DigitPane extends JPanel { 

     private int value; 

     @Override 
     public Dimension getPreferredSize() { 
      FontMetrics fm = getFontMetrics(getFont()); 
      return new Dimension(fm.stringWidth("00"), fm.getHeight()); 
     } 

     public void setValue(int aValue) { 
      if (value != aValue) { 
       int old = value; 
       value = aValue; 
       firePropertyChange("value", old, value); 
       repaint(); 
      } 
     } 

     public int getValue() { 
      return value; 
     } 

     protected String pad(int value) { 
      StringBuilder sb = new StringBuilder(String.valueOf(value)); 
      while (sb.length() < 2) { 
       sb.insert(0, "0"); 
      } 
      return sb.toString(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      String text = pad(getValue()); 
      FontMetrics fm = getFontMetrics(g.getFont()); 
      int x = (getWidth() - fm.stringWidth(text))/2; 
      int y = ((getHeight()- fm.getHeight())/2) + fm.getAscent(); 
      g.drawString(text, x, y); 
     }   
    }  
} 

Обновлено

В принципе вы можете сделать что-то вроде ...

String min = String.valueOf(Calendar.getInstance().get(Calendar.MINUTE)); 
char[] digits = min.toCharArray(); 
+0

@Darth: См. Также подход к масштабированию, принятый в ['JDigit'] (http://stackoverflow.com/a/4151403/230513). – trashgod

+0

Прошу прощения, я не думаю, что я поставил вопрос достаточно ясно в моем первоначальном вопросе. Я отредактировал его и добавил несколько строк в конце для пояснения. – 2013-03-11 16:03:03

+0

@DarthCthulhu Обновленный ответ – MadProgrammer

2

Как показано here, используйте SimpleDateFormat, чтобы отформатировать ваше время. Это даст вам форматированную строку, которую вы можете индексировать, чтобы получить текст для ваших компонентов.

Это связанные example использует следующий форматировщик:

private static final SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 
private final Date now = new Date(); 
... 
String s = df.format(now); 
+0

Прошу прощения, я не думаю, что я поставил вопрос достаточно ясно в моем первоначальном вопросе. Я отредактировал его и добавил несколько строк в конце для пояснения. Будете ли вы мне помогать? – 2013-03-11 16:01:59

+0

Да, насколько я могу угадать методы «DigitPanel». Используйте 's.substring()' для доступа к частям форматированной строки даты. – trashgod