【问题标题】:Prevent Main UI to collapse from child thread防止主 UI 从子线程中折叠
【发布时间】:2011-11-25 15:56:25
【问题描述】:

我有这个代码:

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

【问题讨论】:

    标签: java multithreading swing user-interface jfreechart


    【解决方案1】:

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

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

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

    【讨论】:

    • 我无法使用 JDialog,因为我正在其中实现 Jfree 图表并在此类中绘制图表。请在上面编辑的问题中查看我的代码。谢谢你帮助我。
    • @helloMaga:我不明白你关于无法使用 JDialog 的说法。您给出的所有理由都不是使用 JDialog 的禁忌症,而且您当然知道 JDialog 可以像任何 JFrame 一样拥有复杂的 GUI,对吧?此外,关于您发布的代码,它有许多不必要且实际上不合适的静态字段。
    • 谢谢。这些字段用于引用上面代码中未显示的数据,但是我不确定如何显示生成的图形/系列以在 JDialog 中显示,这样做是否可以解决这个问题。简而言之,我不知道如何将生成的图形嵌入到 J 对话框中。
    • 字段的用途无关紧要,它们不应该是静态的,并且它们的事实表明您的设计已损坏。至于在对话框中显示组件,请查看 JDialog API 和教程,因为它将向您展示您需要了解的大部分内容。
    • @helloMaga:我相信 JFreeChart 的图表扩展了 JPanel,如果是这样,如果您想同时显示多个图表,每个图表都在自己的窗口中,那么您可以简单地将图表设为 JDialog 的contentPane,在对话框上调用 pack 然后显示它。另一方面,如果您一次只显示一个图形,您可能希望在使用 CardLayout 的现有和显示的 JPanel 中换出图形。所有这些静态变量都应该作为非静态字段放入它们自己的类中,并作为参数传递给你的 PcapTool 构造函数。
    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2017-03-23
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多