2012-07-08 2 views
0

병합 ...JPanel의 시계 버튼 내가 시간과 함께 버튼을 병합에에 문제가 있어요

은 내가 JPanel의 버튼 쇼를 얻을 수 없습니다.

import java.awt.Color; 
import java.awt.Font; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public final class Date_Time extends JFrame{ 
    private static final long serialVersionUID = 1L; 
    private JPanel show_date_time = new JPanel(); 
    private JLabel time = new JLabel("Time:"); 
    private JLabel show_time = new JLabel("Show Time"); 

    DateFormat dateFormat2 = new SimpleDateFormat("h:mm:ss a"); 
    java.util.Date date2; 
    private JLabel label; 
    private JPanel panel; 

    public Date_Time(){ 
     this.setSize(300, 300); 
     this.setResizable(false); 
     getContentPane().add(Show_Time_date()); 
    } 
    private JButton button1 = new JButton(); 
    private JFrame frame1 = new JFrame(); 
    public JPanel Show_Time_date(){ 
     frame1.add(show_date_time); 
     show_date_time.setBackground(Color.ORANGE); 
     frame1.add(button1); 
     getShow_date_time().setLayout(null); 
     Font f; 
     f = new Font("SansSerif", Font.PLAIN, 15); 
     getTime().setBounds(0,250,400,30); 
     getTime().setFont(f); 
     getShow_date_time().add(getTime()); 
     setShow_time(new JLabel("")); 
     updateDateTime(); 
     getShow_time().setBounds(37,250,400,30); 
     getShow_time().setFont(f); 
     getShow_date_time().add(getShow_time()); 
     return getShow_date_time(); 

    } 

    public static void main(String[] args) { 
     Date_Time Main_win=new Date_Time(); 
     Main_win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Main_win.setVisible(true); 
    } 

    public void updateDateTime() 
    { 
    Thread th = new Thread(new Runnable() 
     { 
      @Override 
     public void run() 
      { 
      while(true) 
       { 
       date2 = new java.util.Date(); 
       String dateTime = dateFormat2.format(date2); 
        getShow_time().setText(dateTime); 
        getShow_time().updateUI(); 

       } 
      } 
     }); 
    th.start(); 
    } 

    /** 
    * @return the show_time 
    */ 
    public JLabel getShow_time() { 

     return show_time; 
    } 

    /** 
    * @param show_time the show_time to set 
    */ 
    public void setShow_time(JLabel show_time) { 
     this.show_time = show_time; 
    } 

    /** 
    * @return the time 
    */ 
    public JLabel getTime() { 
     return time; 
    } 

    /** 
    * @param time the time to set 
    */ 
    public void setTime(JLabel time) { 
     this.time = time; 
    } 

    /** 
    * @return the show_date_time 
    */ 
    public JPanel getShow_date_time() { 
     return show_date_time; 
    } 

    /** 
    * @param show_date_time the show_date_time to set 
    */ 
    public void setShow_date_time(JPanel show_date_time) { 
     this.show_date_time = show_date_time; 
    } 

    /** 
    * @return the label1 
    */ 


    /** 
    * @param label1 the label1 to set 
    */ 


    /** 
    * @return the label 
    */ 
    public JLabel getLabel() { 

     return label; 
    } 

    /** 
    * @param label the label to set 
    */ 
    public void setLabel(JLabel label) { 
     this.label = label; 
    } 

    /** 
    * @return the panel 
    */ 
    public JPanel getPanel() { 
     return panel; 
    } 

    /** 
    * @param panel the panel to set 
    */ 
    public void setPanel(JPanel panel) { 
     this.panel = panel; 
    } 
} 
+0

[링크] http://txtup.co/ThUkx [링크] – JFetz2191

+0

DATE_TIME 이미 'JFrame', 다른 프레임에 대한 필요성 연장 -'를 frame1'. 'show_date_time'패널에 버튼을 추가하고 프레임에는 추가하지 않습니다. null 레이아웃을 사용하지 마십시오. – tenorsax

+0

버튼을 표시하기 위해 이미 show_date_time 패널을 사용했지만 표시되지 않습니다. – JFetz2191

답변

3
여기

이 수정 된 코드를 살펴 있습니다 :

내 코드입니다

@nIcE 소 노트로
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public final class Date_Time extends JFrame{ 

    private static final long serialVersionUID = 1L; 
    private JPanel show_date_time = new JPanel(); 
    private JLabel time = new JLabel("Time:"); 
    private JLabel show_time = new JLabel("Show Time"); 

    private DateFormat dateFormat2 = 
       new SimpleDateFormat("h:mm:ss a"); 
    private JButton button1 = new JButton("USELESS");   
    private java.util.Date date2; 
    private JLabel label; 
    private JPanel panel; 

    public Date_Time(){   

     //this.setResizable(false); 
     getContentPane().add(show_Time_date()); 
    }  

    public JPanel show_Time_date(){ 

     getShow_date_time().setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 
     /* 
     * Always set this Opaque property of the 
     * said JComponent to true, before 
     * you change the Background Colour 
     * of the said component in question. 
     * In some Look And Feels it's set to 
     * false by default, so you won't 
     * see any colour, in such situations. 
     */ 
     getShow_date_time().setOpaque(true); 
     getShow_date_time().setBackground(Color.ORANGE);   

     Font f; 
     f = new Font("SansSerif", Font.PLAIN, 15); 

     getTime().setFont(f); 
     getShow_date_time().add(getTime()); 
     setShow_time(new JLabel("")); 

     updateDateTime(); 

     getShow_time().setFont(f); 
     getShow_date_time().add(getShow_time()); 
     getShow_date_time().add(button1); 

     return getShow_date_time(); 
    } 

    public static void main(String[] args) { 

     /* 
     * Calls like pack()/setSize()/setVisible() 
     * must be done from inside the Event Dispatch Thread 
     * or the EDT in short. And not from your 
     * Main Thread. Please read Concurrency in Swing 
     * in detail from this link : 
     * http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html 
     */ 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       Date_Time main_win=new Date_Time(); 
       main_win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       main_win.setSize(250, 75); 
       main_win.setVisible(true); 
      } 
     });   
    } 

    public void updateDateTime() 
    { 
     Thread th = new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       while(true) 
       { 
        date2 = new java.util.Date(); 
        final String dateTime = dateFormat2.format(date2); 
        /* 
        * Any updates to the GUI, must also be done 
        * on the EDT - Event Dispatch Thread. 
        */ 
        SwingUtilities.invokeLater(new Runnable() 
        { 
         public void run() 
         { 
          getShow_time().setText(dateTime); 
         } 
        });      
       } 
      } 
     }); 
     th.start(); 
    } 

    /** 
    * @return the show_time 
    */ 
    public JLabel getShow_time() { 

     return show_time; 
    } 

    /** 
    * @param show_time the show_time to set 
    */ 
    public void setShow_time(JLabel show_time) { 
     this.show_time = show_time; 
    } 

    /** 
    * @return the time 
    */ 
    public JLabel getTime() { 
     return time; 
    } 

    /** 
    * @param time the time to set 
    */ 
    public void setTime(JLabel time) { 
     this.time = time; 
    } 

    /** 
    * @return the show_date_time 
    */ 
    public JPanel getShow_date_time() { 
     return show_date_time; 
    } 

    /** 
    * @param show_date_time the show_date_time to set 
    */ 
    public void setShow_date_time(JPanel show_date_time) { 
     this.show_date_time = show_date_time; 
    } 

    /** 
    * @return the label1 
    */ 


    /** 
    * @param label1 the label1 to set 
    */ 


    /** 
    * @return the label 
    */ 
    public JLabel getLabel() { 

     return label; 
    } 

    /** 
    * @param label the label to set 
    */ 
    public void setLabel(JLabel label) { 
     this.label = label; 
    } 

    /** 
    * @return the panel 
    */ 
    public JPanel getPanel() { 
     return panel; 
    } 

    /** 
    * @param panel the panel to set 
    */ 
    public void setPanel(JPanel panel) { 
     this.panel = panel; 
    } 
} 
+1

자바 명명 규칙을 배우고 을 사용하십시오. – kleopatra

+0

코드에서 많은 것을 바꿀 수 있지만 나중에 OP가 자신의 원래 코드 인 :-)를 이해할 수 없기 때문에 LOL, 모든 것이 정상입니다 .-) –

+1

항상 어려운 트레이드 오프; 더 [여기] (http://stackoverflow.com/a/11384153/230513). – trashgod

3

, 스레드 잘못 동기화를하고, invokeLater()은 올바른 솔루션입니다 . 불행히도 스레드는 지속적으로 실행되어 성능을 저해합니다. 이러한 대안을 고려해야합니다

  • 불량 :

    Thread.yield(); // prevent thread from starving 
    
  • 더 나은 : InterruptedExceptioninvokeLater() 후 적절한 지연을 추가 잡을 :

    try { 
        Thread.sleep(500); 
    } catch (InterruptedException ex) { 
        Logger.getLogger(Date_Time.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    
  • 루프에 프로세서를 항복 최고 : here과 같이 javax.swing.Timer을 사용하십시오.

+2

당신의 대답을 보았을 때 좋은 캐치, LOL, 나는 큰 BLUNDER가했던 것을 깨달았습니다.이 상황에서'Timer '를 사용하지 않을 생각이었습니다 :-) 그리고 제가 언급 한 링크는 제가 가장 좋아하는 질문/답변에 속합니다 :-) –

관련 문제