Предотвращение сворачивания основного пользовательского интерфейса из дочернего потока - PullRequest
4 голосов
/ 27 сентября 2011

Я сталкиваюсь с этой проблемой, у меня есть

   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, но когда я закрываю любой из сгенерированных графиков, весь пользовательский интерфейс разрушается, все исчезает. Я хочу сохранить основной пользовательский интерфейс и закрыть конкретный график, который пользователь решил закрыть. Мне пришло в голову, что, поскольку пользовательский интерфейс находится в основном потоке, и я могу создавать новые графики в новом потоке, если я сделаю это и закрою один из дочерних потоков, основной пользовательский интерфейс все еще должен работать. Не могли бы вы помочь мне в этом.

Большое спасибо.


Дополнительный код:

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

}

1 Ответ

2 голосов
/ 27 сентября 2011

Я предполагаю, что это происходит из-за того, что вы используете JFrames или что-то подобное для отображения дочерних окон, и что свойства setDefaultCloseOperation JFrame были установлены в JFrame.EXIT_ON_CLOSE, что приведет к выходу JVM, когда любой из окна закрываются.

Я думаю, что вы должны показывать их в диалоговых окнах, таких как JDialog, а не в JFrame или ApplicationFrame. Кроме того, я должен беспокоиться о вашем использовании потоков. Весь код Swing должен вызываться в одном потоке, EDT, а не в отдельных потоках, как вы, возможно, делаете выше. Конечно, выполняйте длительные вычисления в фоновом потоке, но фактическое отображение диаграммы и любые другие вызовы Swing должны быть в EDT (если вы точно не знаете, что вызовы поточно-ориентированы). Другой вариант - установить для JFrame setDefaultCloseOperation значение JFrame.DISPOSE_ON_CLOSE, но эти парни ведут себя как диалоги, и, на мой взгляд, они должны отображаться как диалоги, JDialogs.

Если это не поможет, рассмотрите возможность публикации минимального скомпилируемого и запускаемого примера, который очень мал, не содержит постороннего кода, не связанного с рассматриваемой проблемой, и который демонстрирует вашу проблему, SSCCE .

...