質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.72%

JPanelでのエラー

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 682

Shoan

score 11

二つ別々のJPanel、DrawArcs.java(Fan) and StillClock.java(clock)が与えられています。

この二つを使って時計がリアルタイムに動き、fanが動くようにし、GUIを使い、自由にスタート&ストップできるようにするようにします。

与えられたコードは以下になります。

import java.awt.*;
import javax.swing.*;
import java.util.*;

public class StillClock extends JPanel {
private int hour;
private int minute;
private int second;

/** Construct a default clock with the current time*/
public StillClock() {
setCurrentTime();
}

/** Construct a clock with specified hour, minute, and second */
public StillClock(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}

/** Return hour */
public int getHour() {
return hour;
}

/** Set a new hour */
public void setHour(int hour) {
this.hour = hour;
repaint();
}

/** Return minute */
public int getMinute() {
return minute;
}

/** Set a new minute */
public void setMinute(int minute) {
this.minute = minute;
repaint();
}

/** Return second */
public int getSecond() {
return second;
}

/** Set a new second */
public void setSecond(int second) {
this.second = second;
repaint();
}

@Override /** Draw the clock */
protected void paintComponent(Graphics g) {
super.paintComponent(g);

// Initialize clock parameters
int clockRadius =
(int)(Math.min(getWidth(), getHeight()) * 0.8 * 0.5);
int xCenter = getWidth() / 2;
int yCenter = getHeight() / 2;

// Draw circle
g.setColor(Color.black);
g.drawOval(xCenter - clockRadius, yCenter - clockRadius,
2 * clockRadius, 2 * clockRadius);
g.drawString("12", xCenter - 5, yCenter - clockRadius + 12);
g.drawString("9", xCenter - clockRadius + 3, yCenter + 5);
g.drawString("3", xCenter + clockRadius - 10, yCenter + 3);
g.drawString("6", xCenter - 3, yCenter + clockRadius - 3);

// Draw second hand
int sLength = (int)(clockRadius * 0.8);
int xSecond = (int)(xCenter + sLength *
Math.sin(second * (2 * Math.PI / 60)));
int ySecond = (int)(yCenter - sLength *
Math.cos(second * (2 * Math.PI / 60)));
g.setColor(Color.red);
g.drawLine(xCenter, yCenter, xSecond, ySecond);

// Draw minute hand
int mLength = (int)(clockRadius * 0.65);
int xMinute = (int)(xCenter + mLength *
Math.sin(minute * (2 * Math.PI / 60)));
int yMinute = (int)(yCenter - mLength *
Math.cos(minute * (2 * Math.PI / 60)));
g.setColor(Color.blue);
g.drawLine(xCenter, yCenter, xMinute, yMinute);

// Draw hour hand
int hLength = (int)(clockRadius * 0.5);
int xHour = (int)(xCenter + hLength *
Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
int yHour = (int)(yCenter - hLength *
Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
g.setColor(Color.green);
g.drawLine(xCenter, yCenter, xHour, yHour);
}

public void setCurrentTime() {
// Construct a calendar for the current date and time
Calendar calendar = new GregorianCalendar();

// Set current hour, minute and second
this.hour = calendar.get(Calendar.HOUR_OF_DAY);
this.minute = calendar.get(Calendar.MINUTE);
this.second = calendar.get(Calendar.SECOND);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
} 
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;

public class DrawArcs extends JFrame {
  public DrawArcs() {
    setTitle("DrawArcs");
    add(new ArcsPanel());
  }

  /** Main method */
  public static void main(String[] args) {
    DrawArcs frame = new DrawArcs();
    frame.setLocationRelativeTo(null); // Center the frame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(250, 300);
    frame.setVisible(true);
  }
}

// The class for drawing arcs on a panel
class ArcsPanel extends JPanel {
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    int xCenter = getWidth() / 2;
    int yCenter = getHeight() / 2;
    int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4);

    int x = xCenter - radius;
    int y = yCenter - radius;

    g.fillArc(x, y, 2 * radius, 2 * radius, 0, 30);
    g.fillArc(x, y, 2 * radius, 2 * radius, 90, 30);
    g.fillArc(x, y, 2 * radius, 2 * radius, 180, 30);
    g.fillArc(x, y, 2 * radius, 2 * radius, 270, 30);
  }
}


今現在、以下のようになりました。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ClockAnimation extends JFrame
{
//create an instance for StillClock
private StillClock clock = new StillClock();

//create buttons
JButton startButton;
JButton stopButton;

//create a timer (1000 milliseconds delay)
Timer timer = new Timer(1000, new TimerListener());

public ClockAnimation()
{
//create a panel to hold the clock
JPanel clockPanel = new JPanel();

//add the clock to panel
clockPanel.add(clock);

//create a panel to hold start and stop buttons
JPanel ButtonPanel = new JPanel();

//create a start button
startButton = new JButton("Start");
//add action listener to startButton
startButton.addActionListener(new startListener());
//create a stop button
stopButton = new JButton("Stop");
//add action listener to stopButton
stopButton.addActionListener(new stopListener());
//add start button to ButtonPanel
ButtonPanel.add(startButton);
//add stop button to ButtonPanel
ButtonPanel.add(stopButton);

//create elapsedPanel to hold elaped time
JPanel ElspsedPanel = new JPanel();

//add start time to panel
add.(timer.start());
//add stop time to panel
add.(timer.stop());
//add the elapsed time to panel
ElapsedPanel.add((timer.start())-(timer.stop()));


//add the clockPanel and ButtonPanel to the frame
add(clockPanel, BorderLayout.NORTH);
add(ButtonPanel, BorderLayout.CENTER);
add(ElapsedPanel, BorderLayout.SOUTH);
}

private class startListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//start clock time
timer.start();
}
}

private class stopListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//stop clock time
timer.stop();
}
}

private class TimerListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//set current time and paint clock to display current time
clock.setCurrentTime();
clock.repaint();
}
}

//main method
public static void main(String[] args)
{
//create a JFrame instance
JFrame frame = new ClockAnimation();

//set title of the frame
frame.setTitle("My Clock");
//set location of the frame to center
frame.setLocationRelativeTo(null);
//set frame to close on exit
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set frame to visable
frame.setVisible(true);
//set components to fit in frame
frame.pack();
}
}


public class ElapsedPanel {
   int startTime;
   double currentElapsedTime;
   double endElapsedTime;

   void start()
   {
   ElapsedPanel timer = null;
   timer.start();
   startTime = (int) System.currentTimeMillis();
   }

   void stop()
   {
   ElapsedPanel timer;
   timer.stop();
   Object elapsedTime = getElapsedTime();
   }

   void getElapsedTime() //Could be called apart from the stop() function to
   //get the elapsed time without stopping the timer
   {
   currentElapsedTime = (System.currentTimeMillis() - startTime)/1000;
   }

   String toStandardTime(double elapsedTime)
   {
   int hours = 0;
   int minutes = 0;
   int seconds = 0;
   String formattedTime;

   minutes = (int) t/60;
   seconds = (int) t%60;
   hours = (int) minutes/60;
   minutes = (int) minutes%60;

   formattedTime = hours + ":" + minutes + ":" + seconds;
   return formattedTime;
   }
}

エラーがコメントの列などに発生しているため大変混乱しています。
どなたか間違った部分を修正していただけますでしょうか。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

エラーがコメントの列などに発生しているため大変混乱しています。

こんな曖昧な言い方では閲覧者にとっても何が何だかわかりません。つまりあなたの質問は提示されているコード以外から何も情報を得られません(あなたがどんなレベルの知識を持っていて、どんな疑問を生じているかが肝心ですがそれ以前の問題です)。せめてどの行で、どんなエラーメッセージが、いつ(コンパイル時もしくは実行時)発生するかと、それに対してあなたがわからない点具体的に記載するのが最低限のマナーです。

例えば「対象のソースコードだけでなく」以下のように「エラーの内容と自分の疑問点」を書くべきです。

$ javac ClockAnimation.java
ClockAnimation.java:47: エラー: <identifier>がありません
    add.(timer.start());
        ^


上のエラーメッセージが出るが、ここで識別子がないというエラーの意味がわからない

こう書いてあれば、閲覧者は見た途端「ピリオドが余分ですよ」というコメントをごく少ない手間で付けられます。


ところでここは例えばJavaの文法を知らないかも知れない質問者に対して文法を一から教えるような場ではありません。本サイトは初心者に比較的親切ですが、それでも右も左もわからないレベルの質問は可能な限り遠慮すべきでしょう。

あなたがまずすべきはJavaの基本文法を教科書などのテキストでしっかり学ぶことと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.72%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる