2011-09-27 99 views
4

我面对这个问题,我有防止主UI从子线程崩溃

class FinalUI1 extends javax.swing.JFrame 
    { 
     //do something 
      Thread t; 
     try { 
      t = new Thread(new PcapTool(null)); 
      t.start(); 
      } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
     // do something 

    } 

 class PcapTool extends ApplicationFrame implements Runnable 
    { 
    //do something 
    public void run() { 
     Display Graph based on above classes input 
     } 
    } 

有一个主界面的窗口和新的图表是在单独的窗口中,每当产生用户点击一个按钮。

问题:我想显示图形,当用户单击FinalUI1类中的按钮时,但是当我关闭任何生成的图形时,整个UI折叠,一切都消失了。我想保留主UI并关闭用户选择关闭的特定图形。在我看来,由于UI在主线程上,我可以在新线程中产生新图形,如果我这样做并关闭子线程之一,那么主UI仍然应该运行。你能帮我解决这个问题吗?

非常感谢。


附加代码:

public class PcapTool extends ApplicationFrame { 
public static String domainChoice, domainConcatenate="";; 
public static XYSeries series1; 
public static XYSeriesCollection dataset=null; 
public static XYSeries series2; 
public static PacketInfo resPacketObject; 
public static Hashtable<String, Object> DomainNameTable=new Hashtable<String, Object>(); 
public static String[] hasArray=new String[100]; 
public static JFreeChart chart; 
public static String customTitle = " "; 
public ArrayList<Double> dataNumberList=new ArrayList<Double>(); 
public static String[]dataUsage; 
public static String[]timeArrival,txRxTag; 
private static final long serialVersionUID = 1L; 
public PcapTool(final String title) throws InterruptedException { 
    super(title); 
    IntervalXYDataset dataset = createDataset(); 
    JFreeChart chart = createChart(dataset); 
    final ChartPanel chartPanel = new ChartPanel(chart); 
    chartPanel.setPreferredSize(new java.awt.Dimension(2000,1000));//(width,height) of display 
    setContentPane(chartPanel); 
} 
public IntervalXYDataset createDataset() throws InterruptedException { 
     // add Series 1 and Series 2 
    } 
    dataset= new XYSeriesCollection(series1); 
    dataset.addSeries(series2); 
    dataset.setIntervalWidth(0.05);//set width here 
    return dataset; 
} 
private JFreeChart createChart(IntervalXYDataset dataset) { 
    final JFreeChart chart = ChartFactory.createXYBarChart(
      "Pcap Analysis Tool\n Domain: "+domainConcatenate, 
      "Time (Seconds)", 
      false, 
      "Data Usage (bytes)", 
      dataset, 
      PlotOrientation.VERTICAL, 
      true, 
      true, 
      false 
      ); 
    return chart;  
} 
public static void main(final String[] args) throws InterruptedException { 

    final PcapTool demo = new PcapTool("PCAP Analysis"); 
    demo.pack(); 
    RefineryUtilities.centerFrameOnScreen(demo); 
    demo.setVisible(true); 
    System.out.println("domain: "+dropBoxUserValue); 
} 

}

回答

2

我猜测,这种行为是由于使用JFrames或相似,以显示你的子窗口的东西你去了,说Jframe的setDefaultCloseOperation性质已设置为JFrame.EXIT_ON_CLOSE,这将导致JVM在任何窗口关闭时退出。

我认为你应该在诸如JDialog之类的对话窗口中显示它们,而不是在JFrame或ApplicationFrame中。另外,我不得不担心你使用线程。所有Swing代码都需要在单个线程(EDT)上调用,而不是像上面所做的那样单独执行线程。当然,在后台线程中进行长时间运行的计算,但是图表和任何其他Swing调用的实际显示必须位于EDT上(除非您确定这些调用是线程安全的)。另一种选择是将JFrame setDefaultCloseOperation设置为JFrame.DISPOSE_ON_CLOSE,但这些人仍然表现为对话框,在我看来,应该显示为对话框JDialogs。

如果这没有帮助,请考虑发布一个非常小的可编译和可运行的最小示例,没有与手头问题无关的无关代码,并且这会演示您的问题SSCCE

+0

我不能使用JDialog,因为我正在实现Jfree图表,并且在此类中绘制图形。请在上面编辑的问题中查看我的代码。感谢您的帮助。 –

+0

@helloMaga:我不明白你的关于不能使用JDialog的说法。你给出的任何原因都不是使用JDialog的禁忌,你当然知道一个JDialog可以像任何JFrame一样拥有复杂的GUI,对吧?另外,关于你发布的代码,它有许多不必要的,实际上不合适的静态字段。 –

+0

谢谢。这些字段是用于引用上面代码中未显示的数据,但是我不确定如何显示生成的图形/系列以在JDialog中显示,这样做会达到此问题的目的。总之,我不知道如何将生成的图嵌入到J对话框中。 –