2012-11-08 6 views
1

'그리기'버튼을 누르면 시계가 나타나지 않습니다. 그 안에있는 textField 객체의 setText 메서드를 호출하면 버튼이 제대로 작동한다는 것을 알 수 있습니다. 나는 여러 가지 일을 시도했는데 아무 것도 찾을 수 없습니다. 나는 심지어 내 교수에게 다가 섰고, 그는 또한 힘든 시간을 보냈다. 하지만 프레임 크기를 조정하면 갑자기 나타났습니다. 왜 그런지 이해할 수 없으며 단순히 '그리기'버튼을 누르는 것만으로 시계를 표시하는 방법을 파악하려고합니다. 어떤 도움을 주셔서 감사 드리며 미리 감사드립니다.JFrame의 크기가 바뀔 때 시계가 나타납니다.

  import java.awt.Graphics; 
      import java.awt.Graphics2D; 
      import java.awt.geom.Ellipse2D; 
      import java.awt.geom.Line2D; 

      import javax.swing.JComponent; 

      public class ClockComponent extends JComponent 
      { 
       final int HOURS_ON_CLOCK = 12; 
       final double MINUTES_IN_HOUR = 60; 
       final double HOUR_LENGTH = .4; 
       final double MINUTE_LENGTH = .9; 

       private double radius; 
       private double posXY; 
       private double hourHandLength; 
       private double minuteHandLength; 
       private double center; 

       private Line2D.Double hourHand; 
       private Line2D.Double minuteHand; 

       public ClockComponent(double rad, double xy) 
       { 
        radius = rad; 
        posXY = xy; 

        center = posXY + radius; 

        hourHandLength = radius * HOUR_LENGTH; 
        minuteHandLength = radius * MINUTE_LENGTH; 

        hourHand = new Line2D.Double(center, center, 
          center, center - hourHandLength); 
        minuteHand = new Line2D.Double(center, center, 
          center, center - minuteHandLength); 
       } 

       public void setClock(int hour, int minute) 
       { 
        final double HOURS_TO_RADIANS = 2 * Math.PI/HOURS_ON_CLOCK; 
        final double MINUTES_TO_RADIANS = 2 * Math.PI/MINUTES_IN_HOUR; 

        hourHand.setLine(center, center, center + hourHandLength * 
          Math.sin((hour + minute/MINUTES_IN_HOUR) * HOURS_TO_RADIANS), 
          center - hourHandLength * 
          Math.cos((hour + minute/MINUTES_IN_HOUR) * HOURS_TO_RADIANS)); 
        minuteHand.setLine(center, center, 
          center + minuteHandLength * Math.sin(minute * MINUTES_TO_RADIANS), 
          center - minuteHandLength * Math.cos(minute * MINUTES_TO_RADIANS)); 
       } 

       public void paintComponent(Graphics g) 
       { 
        Graphics2D g2 = (Graphics2D) g; 

        double diameter = 2 * radius; 

        Ellipse2D.Double clockFace = 
          new Ellipse2D.Double(posXY, posXY, diameter, diameter); 

        g2.draw(clockFace); 
        g2.draw(hourHand); 
        g2.draw(minuteHand); 
       } 
      } 

ClockFrame 클래스를 ActionListener를 내부 클래스 : 여기

당신이 그들에게 자신을 실행하고자하지만, 그 선호 간결, ClockFrame 클래스에서 내부 클래스에 초점 단지의 경우 자신의 전체 내 클래스입니다. 나는 ActionListener를 내부 클래스는 내가 뭔가를 놓친 거지 곳이라고 생각하지만 정확히 ...

  import java.awt.BorderLayout; 
      import java.awt.GridLayout; 
      import java.awt.event.ActionEvent; 
      import java.awt.event.ActionListener; 

      import javax.swing.JButton; 
      import javax.swing.JFrame; 
      import javax.swing.JLabel; 
      import javax.swing.JPanel; 
      import javax.swing.JTextField; 
      import javax.swing.border.EtchedBorder; 

      public class ClockFrame extends JFrame 
      { 
       final int FIELD_SIZE = 10; 
       final int FRAME_WIDTH = 450; 
       final int FRAME_HEIGHT = 450; 
       final int FIELD_WIDTH = 5; 

       private JPanel frameFace; 
       private JPanel fieldPanel; 
       private JPanel drawingPanel; 

       private JLabel hourLabel; 
       private JLabel minuteLabel; 

       private JTextField hourField; 
       private JTextField minuteField; 

       private JButton drawButton; 

       private ClockComponent clock; 

       public ClockFrame(double rad, double xy) 
       { 
        setTitle("Clock viewer"); 
        setSize(FRAME_WIDTH, FRAME_HEIGHT); 

        frameFace = new JPanel(new BorderLayout()); 
        fieldPanel = new JPanel(); 
        drawingPanel = new JPanel(); 
        drawingPanel.setBorder(new EtchedBorder()); 

        hourLabel = new JLabel(); 
        hourLabel.setText("Hour "); 

        minuteLabel = new JLabel(); 
        minuteLabel.setText("Minute "); 

        hourField = new JTextField(FIELD_SIZE); 
        minuteField = new JTextField(FIELD_SIZE); 

        drawButton = new JButton("Draw"); 
        drawingPanel.setLayout(new GridLayout(1, 1)); 

        clock = new ClockComponent(rad, xy); 

        fieldPanel.add(hourLabel); 
        fieldPanel.add(hourField); 
        fieldPanel.add(minuteLabel); 
        fieldPanel.add(minuteField); 
        fieldPanel.add(drawButton); 

        ActionListener clockListener = new DrawListener(); 
        drawButton.addActionListener(clockListener); 

        frameFace.add(fieldPanel, BorderLayout.NORTH); 
        frameFace.add(drawingPanel, BorderLayout.CENTER); 

        add(frameFace); 
       } 

       class DrawListener implements ActionListener 
       { 
        public void actionPerformed(ActionEvent event) 
        { 
         int hour = Integer.parseInt(hourField.getText()); 
         int minute = Integer.parseInt(minuteField.getText()); 

         clock.setClock(hour, minute); 
         drawingPanel.add(clock); 
        } 
       } 
      } 

그리고 주요 방법은

  import javax.swing.JFrame; 

      public class ClockViewer 
      { 
       public static void main(String[] args) 
       { 
        JFrame frame = new ClockFrame(75, 100); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true); 
       } 
      } 

답변

3

당신이에 구성 요소를 추가 할 때마다 무엇을 알아낼 수 없습니다 컨테이너를 제거하거나 GUI를 구현 한 후 컨테이너에서 컨테이너를 제거하려면 해당 컨테이너에 해당 구성 요소를 다시 레이아웃하고 다시 그려야한다고 지시해야합니다. 이것은, 여기에 drawingPanel 용기에 revalidate() 다음 repaint()를 호출하여 수행됩니다

clock.setClock(hour, minute); 
drawingPanel.add(clock); 
drawingPanel.revalidate(); 
drawingPanel.repaint(); 
+0

은 훌륭하게 일을 그! 너무 감사합니다! – user1800967

+0

@ user1800967 : 환영합니다! –

관련 문제