应用程序在Java 6上工作,但不在Java 7
我正在创建一个Java swing应用程序 - 排序和搜索算法的动画。我使用JDeveloper 11g release2编写代码,默认情况下使用jdk 1.6,应用程序运行良好,但部署后我尝试在我的计算机上运行它,女巫拥有jdk 1.7,应用程序在随机时刻冻结并且不会恢复。我尝试了不同的个人电脑和操作系统,每个人的应用程序都与Java 6很好,但如果与Java 7启动卡住了。我尝试调试它,但调试器冻结喜欢的应用程序,不解冻,直到我关闭它与Windows任务管理器。应用程序在Java 6上工作,但不在Java 7
设法跟踪应用程序在尝试设置文本时会冻结方法descriptionTA.setText(文本)(下面类的最后一个方法),有时会设置正确,但大多数情况下,一切都会停止没有错误信息或其他生命信号。
这是发生问题的女巫班。
import animatedalgorithms.MasterFrame;
import animatedalgorithms.sorting.SortAnimationComponent;
import helperclasses.ApplicationConstants;
import helperclasses.RenderedJLabel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.TreeMap;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SortAnimationPanel extends JPanel {
private static final int DESCENDING_EELMENT_ORDER = 0;
private static final int ASCENDING_ELEMEMENT_ORDER = 1;
private static final int RANDOM_ELEMENT_ORDER = 2;
private MasterFrame frame;
private SortAnimationComponent comp;
private RenderedJLabel h1;
private JSlider algSlider;
private JSlider animSlider;
BackButtonComponent backBtn;
private int elmOrder;
private JTextArea descriptionTA ;
public SortAnimationPanel(MasterFrame frame) {
elmOrder = RANDOM_ELEMENT_ORDER;
this.setBorder(new LineBorder(Color.black));
this.frame = frame;
this.setLayout(new BorderLayout());
h1 = new RenderedJLabel("");
h1.setFont(new Font("Segoe UI Semibold", Font.PLAIN, 20));
h1.setForeground(Color.white);
createControls();
}
public void createControls() {
// Header
JPanel header = new JPanel();
header.setLayout(new BorderLayout());
header.setBackground(new Color(30, 30, 30));
header.setBorder(new EmptyBorder(0, 10, 5, 5));
header.setForeground(Color.WHITE);
header.add(h1, BorderLayout.CENTER);
JPanel aboutBtn = new JPanel();
aboutBtn.setName("aboutPanel");
aboutBtn.setBackground(Color.BLACK);
final RenderedJLabel aboutLabel = new RenderedJLabel("Apie algoritmą");
aboutLabel.setForeground(Color.WHITE);
aboutLabel.setFont(new Font("Arial", Font.BOLD, 12));
aboutBtn.add(aboutLabel);
header.add(aboutBtn, BorderLayout.EAST);
add(header, BorderLayout.NORTH);
//Bottom controls
JButton btn = new JButton("Iš naujo");
btn.setName("replay");
JButton btnPlay = new JButton("Rikiuoti");
btnPlay.setName("play");
JButton btnPause = new JButton("Pauzė");
btnPause.setName("pause");
JButton btnStep = new JButton("Žingsnis");
btnStep.setName("step");
backBtn = new BackButtonComponent();
JPanel controls = new JPanel();
controls.setLayout(new BoxLayout(controls, BoxLayout.X_AXIS));
controls.setBackground(Color.WHITE);
controls.add(btn);
controls.add(btnPlay);
controls.add(btnPause);
controls.add(btnStep);
controls.add(Box.createHorizontalStrut(10));
Border empty = BorderFactory.createEmptyBorder(10, 10, 30, 10);
controls.setBorder(empty);
JPanel labels = new JPanel();
labels.setLayout(new BoxLayout(labels, BoxLayout.Y_AXIS));
labels.add(new JLabel("Algoritmo greitis: "));
labels.add(new JLabel("Animacijos greitis: "));
labels.setBackground(Color.WHITE);
controls.add(labels);
JPanel sliders = new JPanel();
sliders.setBackground(Color.WHITE);
sliders.setLayout(new BoxLayout(sliders, BoxLayout.Y_AXIS));
algSlider = new JSlider(JSlider.HORIZONTAL, 100, 10000, 10000 - ApplicationConstants.DEFAULT_ALGORITHM_DELAY);
algSlider.setBackground(Color.WHITE);
algSlider.setMajorTickSpacing(2000);
algSlider.setMinorTickSpacing(100);
animSlider = new JSlider(JSlider.HORIZONTAL, 0, 20, 10);
animSlider.setMajorTickSpacing(10);
animSlider.setBackground(Color.WHITE);
animSlider.setMinorTickSpacing(2);
sliders.add(algSlider);
sliders.add(animSlider);
controls.add(Box.createHorizontalStrut(10));
controls.add(sliders);
class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton eventObj = (JButton)e.getSource();
if (eventObj.getName().equalsIgnoreCase("play")) {
comp.setToPlay();
} else if (eventObj.getName().equalsIgnoreCase("pause")) {
comp.setToPause();
} else if (eventObj.getName().equalsIgnoreCase("replay")) {
resetControls();
switch (elmOrder) {
case RANDOM_ELEMENT_ORDER:
comp.generateRandomArray();
break;
case ASCENDING_ELEMEMENT_ORDER:
comp.generateAscendingArray();
break;
case DESCENDING_EELMENT_ORDER:
comp.generateDescendingArray();
break;
}
comp.resetSorter();
comp.startAnimation();
} else if (eventObj.getName().equalsIgnoreCase("step")) {
comp.step();
}
}
}
class CustomMouseListener implements MouseListener {
boolean pressed = false;
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
pressed = true;
}
@Override
public void mouseReleased(MouseEvent e) {
if (pressed) {
if (e.getSource() instanceof JPanel) {
JFrame aboutFrame = new DescriptionFrame(comp.getAlgorithmNum());
} else {
comp.stopThread();
frame.setVisibleCard(MasterFrame.MENU_WINDOW);
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
if (e.getSource() instanceof JPanel) {
JPanel p = (JPanel) e.getSource();
p.setBackground(Color.WHITE);
aboutLabel.setForeground(Color.black);
} else {
BackButtonComponent comp = (BackButtonComponent)e.getSource();
comp.setCompColor(Color.lightGray);
comp.repaint();
}
}
@Override
public void mouseExited(MouseEvent e) {
if (e.getSource() instanceof JPanel) {
JPanel p = (JPanel) e.getSource();
p.setBackground(Color.black);
aboutLabel.setForeground(Color.white);
} else {
BackButtonComponent comp = (BackButtonComponent)e.getSource();
comp.setCompColor(Color.GRAY);
comp.repaint();
pressed = false;
}
}
}
class SliderListener implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
if (source.getMaximum() == 20) {
comp.setAnimationDelay(source.getMaximum() - source.getValue());
} else {
comp.setAlgorithmStepDelay(source.getMaximum() - source.getValue());
}
}
}
}
ActionListener btnListener = new ButtonListener();
btn.addActionListener(btnListener);
btnPlay.addActionListener(btnListener);
btnStep.addActionListener(btnListener);
btnPause.addActionListener(btnListener);
CustomMouseListener l = new CustomMouseListener();
backBtn.addMouseListener(l);
aboutBtn.addMouseListener(l);
ChangeListener sliderListener = new SliderListener();
algSlider.addChangeListener(sliderListener);
animSlider.addChangeListener(sliderListener);
add(controls, BorderLayout.SOUTH);
}
public void createLeftMenu() {
}
public void resetControls() {
algSlider.setValue(algSlider.getMaximum() - ApplicationConstants.DEFAULT_ALGORITHM_DELAY);
animSlider.setValue(animSlider.getMaximum() - ApplicationConstants.DEFAULT_ANIMATION_DELAY);
}
public void loadAlgorithm(int sorterNum) {
resetControls();
JPanel sortPanel = new JPanel();
sortPanel.setBackground(Color.WHITE);
descriptionTA = new JTextArea();
descriptionTA.setSelectionColor(Color.BLACK);
descriptionTA.setFocusable(false);
descriptionTA.setEnabled(true);
descriptionTA.setRows(5);
descriptionTA.setColumns(10);
descriptionTA.setFont(new Font("Arial", Font.BOLD, 12));
descriptionTA.setWrapStyleWord(true);
descriptionTA.setLineWrap(true);
TitledBorder title = BorderFactory.createTitledBorder("Aprašymas");
descriptionTA.setBorder(title);
HistoryComponent hist = new HistoryComponent(new TreeMap<String, Color>(), 30);
TreeMap<String, Color> map = new TreeMap<String, Color>();
switch (sorterNum) {
case ApplicationConstants.SELECTION_SORT_NUM:
h1.setText("Išrinkimo rikiavimo algoritmas");
map.put("- Mažiausias elementas", ApplicationConstants.IMPORTANT_ELEMENT_COLOR);
map.put("- Pasirinktas elementas", ApplicationConstants.SELECTED_ELEMENT_COLOR);
map.put("- Neutralus elementas", ApplicationConstants.NEUTRAL_ELEMENT_COLOR);
map.put("- Surikiuotas masyvas", ApplicationConstants.SORTED_ELEMENT_COLOR);
hist.setMap(map);
hist.repaint();
comp = new SortAnimationComponent(ApplicationConstants.SELECTION_SORT_NUM, this);
comp.setToPause();
comp.startAnimation();
break;
case ApplicationConstants.BUBBLE_SORT_NUM:
h1.setText("Burbulo rikiavimo algoritmas");
map.put("- Pasirinktas elementas", ApplicationConstants.SELECTED_ELEMENT_COLOR);
map.put("- Neutralus elementas", ApplicationConstants.NEUTRAL_ELEMENT_COLOR);
hist.setMap(map);
hist.repaint();
comp = new SortAnimationComponent(ApplicationConstants.BUBBLE_SORT_NUM, this);
comp.setToPause();
comp.startAnimation();
break;
case ApplicationConstants.INSERTION_SORT_NUM:
h1.setText("Įterpimo rikiavimo algoritmas");
map.put("- Surikiuotas masyvas", ApplicationConstants.SORTED_ELEMENT_COLOR);
map.put("- Pasirinktas elementas", ApplicationConstants.SELECTED_ELEMENT_COLOR);
map.put("- Neutralus elementas", ApplicationConstants.NEUTRAL_ELEMENT_COLOR);
hist.setMap(map);
hist.repaint();
comp = new SortAnimationComponent(ApplicationConstants.INSERTION_SORT_NUM, this);
comp.setToPause();
comp.startAnimation();
break;
case ApplicationConstants.QUICK_SORT_NUM:
h1.setText("Greitojo rikiavimo algoritmas");
map.put("- Vidurio taškas ", ApplicationConstants.IMPORTANT_ELEMENT_COLOR);
map.put("- Neutralus elementas", ApplicationConstants.NEUTRAL_ELEMENT_COLOR);
map.put("- Neaktyvus elementas", ApplicationConstants.INACTIVE_ELEMENT_COLOR);
hist.setMap(map);
hist.repaint();
comp = new SortAnimationComponent(ApplicationConstants.QUICK_SORT_NUM, this);
comp.setToPause();
comp.startAnimation();
break;
case ApplicationConstants.MERGE_SORT_NUM:
h1.setText("Suliejimo rikiavimo algoritmas");
map.put("- Neutralus elementas", ApplicationConstants.NEUTRAL_ELEMENT_COLOR);
map.put("- Neaktyvus elementas", ApplicationConstants.INACTIVE_ELEMENT_COLOR);
hist.setMap(map);
hist.repaint();
comp = new SortAnimationComponent(ApplicationConstants.MERGE_SORT_NUM, this);
comp.setToPause();
comp.startAnimation();
break;
default:
h1.setText("Išrinkimo rikiavimo algoritmas");
map.put("- Mažiausias elementas", ApplicationConstants.IMPORTANT_ELEMENT_COLOR);
map.put("- Pasirinktas elementas", ApplicationConstants.SELECTED_ELEMENT_COLOR);
map.put("- Neutralus elementas", ApplicationConstants.NEUTRAL_ELEMENT_COLOR);
hist.setMap(map);
hist.repaint();
comp = new SortAnimationComponent(ApplicationConstants.SELECTION_SORT_NUM, this);
comp.setToPause();
comp.startAnimation();
break;
}
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BorderLayout());
leftPanel.setBackground(Color.WHITE);
JPanel spacer = new JPanel();
spacer.setBackground(Color.white);
spacer.setLayout(new BoxLayout(spacer, BoxLayout.X_AXIS));
spacer.add(backBtn);
spacer.add(Box.createHorizontalStrut(120));
leftPanel.add(spacer, BorderLayout.NORTH);
JPanel elmOrderPanel = new JPanel();
elmOrderPanel.setLayout(new BoxLayout(elmOrderPanel, BoxLayout.Y_AXIS));
elmOrderPanel.setBorder(BorderFactory.createTitledBorder("Elementų išdėstymas"));
JButton ascBtn = new JButton("Didėjimo tvarka");
ascBtn.setName("ascBtn");
JButton descBtn = new JButton("Mažėjimo tvarka");
descBtn.setName("descBtn");
JButton randBtn = new JButton("Atsitiktine tvarka");
randBtn.setName("randBtn");
elmOrderPanel.add(ascBtn);
elmOrderPanel.add(descBtn);
elmOrderPanel.add(randBtn);
elmOrderPanel.setBackground(Color.WHITE);
leftPanel.add(elmOrderPanel, BorderLayout.SOUTH);
TitledBorder colorBorder = BorderFactory.createTitledBorder("Spalvų reikšmės");
hist.setBorder(colorBorder);
leftPanel.add(hist, BorderLayout.CENTER);
class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton eventObj = (JButton)e.getSource();
if (eventObj.getName().equalsIgnoreCase("randBtn")) {
resetControls();
comp.generateRandomArray();
comp.resetSorter();
comp.startAnimation();
elmOrder = RANDOM_ELEMENT_ORDER;
} else if (eventObj.getName().equalsIgnoreCase("descBtn")) {
resetControls();
comp.generateDescendingArray();
comp.resetSorter();
comp.startAnimation();
elmOrder = DESCENDING_EELMENT_ORDER;
} else if (eventObj.getName().equalsIgnoreCase("ascBtn")) {
resetControls();
comp.generateAscendingArray();
comp.resetSorter();
comp.startAnimation();
elmOrder = ASCENDING_ELEMEMENT_ORDER;
}
}
}
ButtonListener l = new ButtonListener();
ascBtn.addActionListener(l);
descBtn.addActionListener(l);
randBtn.addActionListener(l);
sortPanel.setLayout(new BorderLayout());
sortPanel.add(comp, BorderLayout.CENTER);
sortPanel.add(descriptionTA, BorderLayout.SOUTH);
sortPanel.add(leftPanel, BorderLayout.WEST);
add(sortPanel, BorderLayout.CENTER);
this.updateUI();
}
public void setDescriptionText(String text){
descriptionTA.setText(text);
}
}
的setDescriptionText会从管理中的JTextArea面板上面的动画,并设置在它的文本诺特尔线程调用。
怪异的事情对我来说,它可以完美兼容比Java 7
旧版本如果你需要更多的代码来检测问题,请让我知道。
您应该确保descriptionTA.setText()被调用的EventDispatchedThread:
public void setDescriptionText(String text){
Runnable toEDT = new Runnable() {
@Override
public void run() {
descriptionTA.setText(text);
}
};
if(SwingUtilities.isEventDispatchThread()) {
toEDT.run();
}else {
SwingUtilities.invokeLater(toEDT);
}
}
所有UI相关的操作(instanciation,修改等)应在美国东部时间,以避免死锁或其他有趣的事情。
它在Java 2013-05-13 15:02:30
我不知道,我想没人能解释。这是线程相关的东西,很难调试和理解。只需申请一下:从不做与美国东部时间以外的用户界面相关的东西。 – 2013-05-13 15:05:43
Swing有一个专门用于更新其GUI的线程。所以,如果你想更新你的界面,不调用任何其他线程,尝试用预留的方法来更新你的界面:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Here, we can safely update the GUI
// because we'll be called from the
// event dispatch thread
statusLabel.setText("Query: " + queryNo);
}
});
那种你所看到的行为和事实,即你的类名为SortAnimationPanel导致我认为这是一个线程问题。确保每个对swing组件的访问都是从事件派发线程完成的,而不是从背景动画线程中完成 – 2013-05-13 14:37:55
是否有您的代码抛出的任何异常?或者它只是停止? – 2013-05-13 14:39:26
请将代码缩小到所需的最小值。只要问题仍然存在,就尽量减少代码。确保从EDT调用setDescriptionText。 – 2013-05-13 14:40:50