gpt4 book ai didi

java - 防止主 UI 从子线程崩溃

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:15 25 4
gpt4 key购买 nike

我有这个代码:

   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
}
}

有一个主 UI 窗口,只要用户单击一个按钮,就会在单独的窗口中生成新图形。

我想显示图形,当用户单击 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);
}
}

最佳答案

我猜测此行为是由于您使用 JFrame 或类似的东西来显示您的子窗口,并且 JFrame 的 setDefaultCloseOperation 属性已设置为 JFrame.EXIT_ON_CLOSE 这将导致 JVM 在任何窗口关闭时退出。

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

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

关于java - 防止主 UI 从子线程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com