将类分成方法类和图形类

时间:2015-04-01 12:19:37

标签: java class

我一直在尝试创建单独的类,1个使用方法,1个使用主App,1个使用图形。  但我一直得到这个错误“线程中的异常”主“java.lang.StackOverflowError”如何解决这个问题?

public class App {
 public static void main(String[] args) {
        Stopwatch sw = new Stopwatch();
        sw.setVisible();
    }
 }

这是框架类

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class Stopwatch {
Frame123 f = new Frame123 ();

private static final String imgIcon = "data/icon.png";
private static final int WIDTH = 300;
private static final int HEIGHT = 150;


private final JTextField fieldTime;
private final JButton buttonPlay;
private final JButton buttonPause;
private final Action actionPlay;
private final Action actionPause;
private final Action actionReset;


private final JFrame frame;


private final Runnable ticker = new Runnable() {
    public void run() {
        f.tick();
    }
};



public JButton getButtonPlay() {
    return buttonPlay;
}

public JButton getButtonPause() {
    return buttonPause;
}

public Action getActionPlay() {
    return actionPlay;
}

public Action getActionPause() {
    return actionPause;
}

public Action getActionReset() {
    return actionReset;
}

public Runnable getTicker() {
    return ticker;
}

public Stopwatch() {
    frame = new JFrame("Stop Watch V 1.2");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.setIconImage(new ImageIcon(imgIcon).getImage());
    frame.setSize(WIDTH, HEIGHT);
    frame.setResizable(false);
    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
    frame.setContentPane(mainPanel);

    fieldTime = new JTextField(f.getResettime());
    fieldTime.setEditable(false);
    Font bigFont = fieldTime.getFont().deriveFont(Font.PLAIN, 50f);
    fieldTime.setFont(bigFont);
    mainPanel.add(fieldTime);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
    mainPanel.add(buttonPanel, BorderLayout.SOUTH);

    actionPlay = new AbstractAction("Start") {

        @Override
        public void actionPerformed(ActionEvent e) {
            f.start();
        }
    };

    actionPause = new AbstractAction("Pause") {
        @Override
        public void actionPerformed(ActionEvent e) {
            f.pause();
        }
    };

    actionReset = new AbstractAction("Reset") {
        @Override
        public void actionPerformed(ActionEvent e) {
            f.reset();
        }
    };

    buttonPlay = new JButton(actionPlay);
    buttonPanel.add(buttonPlay);
    buttonPause = new JButton(actionPause);
    buttonPanel.add(buttonPause);
    buttonPanel.add(new JButton(actionReset));

}

public final void setVisible() {
    frame.setVisible(true);
    buttonPlay.requestFocusInWindow();
}


public void displayTime(final String todisplay) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            fieldTime.setText(todisplay);
        }
    });
   }
}

这是方法类

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class Frame123 {

   Stopwatch a = new Stopwatch();
    private long lasttick = 0L;
    private boolean paused = false;
    private long elapsed = 0L;
    private final ReentrantLock lock = new ReentrantLock();
    private final ScheduledExecutorService executor =             Executors.newScheduledThreadPool(1);
    private ScheduledFuture<?> running = null;
    private static final String RESETTIME = buildTime(0);

 public void start() {
        lock.lock();
        try {
            if (running!= null) {
                return;
            }

            paused = false;
            lasttick = System.currentTimeMillis();
            running = executor.scheduleAtFixedRate(a.getTicker(), 10, 10, TimeUnit.MILLISECONDS);

            a.getActionPlay().setEnabled(false);
            a.getActionPause().setEnabled(true);
            a.getActionReset().setEnabled(false);
            a.getButtonPause().requestFocusInWindow();
        } finally {
            lock.unlock();
        }
    }

    public void pause() {
        lock.lock();
        try {
            if (running == null) {
                return;
            }
            running.cancel(false);
            paused = true;
            running = null;

            a.getActionPlay().setEnabled(true);
            a.getActionPause().setEnabled(false);
            a.getActionReset().setEnabled(true);
            a.getButtonPlay().requestFocusInWindow();
        } finally {
            lock.unlock();
        }
    }

    public void reset() {
        lock.lock();
        try {
            if (running != null) {
                return;
            }
            elapsed = 0;
            a.displayTime(RESETTIME);

            a.getActionPlay().setEnabled(true);
            a.getActionPause().setEnabled(false);
            a.getActionReset().setEnabled(true);
            a.getButtonPlay().requestFocusInWindow();
        } finally {
            lock.unlock();
        }
    }

    public String getResettime() {
        return RESETTIME;
    }

    public static final String buildTime(final long elapsed) {
        long hundredths = elapsed / 10;
        long seconds = hundredths / 100;
        long minutes = seconds / 60;
        long hours = minutes / 60;

        return String.format("%02d:%02d:%02d:%02d", hours, minutes % 60, seconds % 60, hundredths % 100);
    }

    public void tick() {
        lock.lock();
        try {
            long now = System.currentTimeMillis();
            long delta = now - lasttick;
            lasttick = now;
            if (!paused) {
                elapsed += delta;
                a.displayTime(buildTime(elapsed));
            }
        } finally {
            lock.unlock();
        }
    }
  }

这是工人阶级,所有课程都在一起!

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;


public class Frame1 {


private static final int WIDTH = 700;
private static final int HEIGHT = 350;

private static final String RESETTIME = buildTime(0);

public class App {
 public static void main(String[] args) {
        Stopwatch sw = new Stopwatch();
        sw.setVisible();
    }
 }


private static final String buildTime(final long elapsed) {
    long hundredths = elapsed / 10;
    long seconds = hundredths / 100;
    long minutes = seconds / 60;
    long hours = minutes / 60;

    return String.format("%02d:%02d:%02d:%02d", hours, minutes % 60, seconds % 60, hundredths % 100);
}

private final JTextField fieldTime;
private final JTextField fieldTime_2;
private final JButton buttonPlay;
private final JButton buttonPause;
private final JButton buttonLaptime;
private final Action actionPlay;
private final Action actionPause;
private final Action actionReset;
private final Action actionLaptime;

private final JFrame frame;

private final ReentrantLock lock = new ReentrantLock();


private long lasttick = 0;
private boolean paused = false;
private long elapsed = 0;
private ScheduledFuture<?> running = null;

private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

private final Runnable ticker = new Runnable() {
    public void run() {
        tick();
    }
};

public Frame1() {

    frame = new JFrame("Stop Watch");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setResizable(false);
    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
    frame.setContentPane(mainPanel);

    fieldTime = new JTextField(RESETTIME);
    fieldTime.setEditable(false);
    Font bigFont = fieldTime.getFont().deriveFont(Font.PLAIN, 110f);
    fieldTime.setFont(bigFont);
    mainPanel.add(fieldTime);

    fieldTime_2 = new JTextField();
    fieldTime_2.setEditable(false);
    Font bigFont_2 = fieldTime_2.getFont().deriveFont(Font.PLAIN, 110f);
    fieldTime_2.setFont(bigFont_2);
    mainPanel.add(fieldTime_2);


    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
    mainPanel.add(buttonPanel, BorderLayout.NORTH);

    actionPlay = new AbstractAction("Start") {

        @Override
        public void actionPerformed(ActionEvent e) {
            start();
        }
    };

    actionPause = new AbstractAction("Pause") {
        @Override
        public void actionPerformed(ActionEvent e) {
            pause();
        }
    };

    actionReset = new AbstractAction("Reset") {
        @Override
        public void actionPerformed(ActionEvent e) {
            reset();
        }
    };

    actionLaptime = new AbstractAction("Laptime") {
        @Override
        public void actionPerformed(ActionEvent e) {
            lap(buildTime(elapsed));
        }
    };

    buttonPlay = new JButton(actionPlay);
    buttonPanel.add(buttonPlay);
    buttonPause = new JButton(actionPause);
    buttonPanel.add(buttonPause);
    buttonPanel.add(new JButton(actionReset));
    buttonLaptime = new JButton(actionLaptime);
    buttonPanel.add(buttonLaptime);


}

public final void setVisible() {
    frame.setVisible(true);
    buttonPlay.requestFocusInWindow();
}

private void start() {
    lock.lock();
    try {
        if (running != null) {
            return;
        }

        paused = false;
        lasttick = System.currentTimeMillis();
        running = executor.scheduleAtFixedRate(ticker, 10, 10, TimeUnit.MILLISECONDS);

        actionPlay.setEnabled(false);
        actionPause.setEnabled(true);
        actionReset.setEnabled(false);
        actionLaptime.setEnabled(true);
        buttonPause.requestFocusInWindow();
    } finally {
        lock.unlock();
    }
}

public void lap(final String todisplay) {
    if (running != null) {
         fieldTime_2.setText(todisplay);

    } else {

    }
}

public JTextField getFieldTime_2() {
    return fieldTime_2;
}

private void pause() {
    lock.lock();
    try {
        if (running == null) {
            return;
        }
        running.cancel(false);
        paused = true;
        running = null;

        actionPlay.setEnabled(true);
        actionPause.setEnabled(false);
        actionReset.setEnabled(true);
        actionLaptime.setEnabled(false);
        buttonPlay.requestFocusInWindow();
    } finally {
        lock.unlock();
    }
}

private void reset() {
    lock.lock();
    try {
        if (running != null) {
            return;
        }
        elapsed = 0;
        displayTime(RESETTIME);
        fieldTime_2.setText(RESETTIME); 

        actionPlay.setEnabled(true);
        actionPause.setEnabled(false);
        actionReset.setEnabled(true);
        buttonPlay.requestFocusInWindow();
    } finally {
        lock.unlock();
    }
}

private void tick() {
    lock.lock();
    try {
        long now = System.currentTimeMillis();
        long delta = now - lasttick;
        lasttick = now;
        if (!paused) {
            elapsed += delta;
            displayTime(buildTime(elapsed));
        }
    } finally {
        lock.unlock();
    }
}

private void displayTime(final String todisplay) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            fieldTime.setText(todisplay);
         }
     });
  }
} 

错误行

Exception in thread "main" java.lang.StackOverflowError
at jjhjh.Stopwatch.<init>(Stopwatch.java:18)
at jjhjh.Frame123.<init>(Frame123.java:11)
at jjhjh.Stopwatch.<init>(Stopwatch.java:18)
at jjhjh.Frame123.<init>(Frame123.java:11)
at jjhjh.Stopwatch.<init>(Stopwatch.java:18)
at jjhjh.Frame123.<init>(Frame123.java:11)
at jjhjh.Stopwatch.<init>(Stopwatch.java:18)

0 个答案:

没有答案