我一直在尝试创建单独的类,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)