2011-09-27 7 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 
     } 
    } 

사용자가 버튼을 클릭 할 때마다 메인 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); 
} 

답변

2

내가이 동작은 당신의 JFrames 또는 자식 창을 표시 비슷한을 사용하기 때문이라고 추측하고 JFrame의의 setDefaultCloseOperation 특성이있어 JFrame.EXIT_ON_CLOSE으로 설정되었으므로 창 중 하나가 닫히면 JVM이 종료됩니다.

JFrame 또는 ApplicationFrame이 아닌 JDialog와 같은 대화 상자 창에 표시해야한다고 생각합니다. 또한 스레딩 사용에 대해 걱정해야합니다. 모든 스윙 코드는 하나의 단일 스레드 인 EDT에서 호출해야합니다. 위에서 수행 한 것처럼 별도의 스레드가 아닙니다. 물론 백그라운드 스레드에서 장기 실행 계산을 해보지 만 차트와 다른 Swing 호출의 실제 표시는 EDT에 있어야합니다 (호출이 스레드로부터 안전한지 확실하지 않은 경우). 다른 옵션은 JFrame setDefaultCloseOperationJFrame.DISPOSE_ON_CLOSE으로 설정하는 것입니다.하지만이 사람들은 여전히 ​​대화 상자로 행동하고 내 마음 속에는 대화 상자, JDialogs로 표시되어야합니다.

이 방법이 도움이되지 않는다면 최소한의 컴파일 가능한 실행 가능한 예제를 게시하는 것이 좋습니다.이 예제는 현재 사용중인 문제와 관련이없는 관련없는 코드가없고 SSCCE을 보여줍니다.

+0

Jfree 차트를 구현하고 있으며이 클래스에 그래프를 그리기 때문에 JDialog를 사용할 수 없습니다. 위의 편집 된 질문에서 내 코드를 참조하십시오. 도와 주셔서 감사합니다. –

+0

@helloMaga : JDialog를 사용할 수 없다는 것에 대한 진술을 이해할 수 없습니다. 당신이 주신 이유는 JDialog 사용에 대한 금기 사항이 아니며, 물론 JDialog가 JFrame만큼 복잡한 GUI를 유지할 수 있다는 것을 알고 있습니까? 또한 게시 한 코드에 관해서는 불필요하고 실제로는 부적절한 정적 필드가 많이 있습니다. –

+0

감사합니다. 필드는 위의 코드에 표시되지 않은 데이터를 참조하기위한 것이지만 JDialog에 표시하기 위해 생성 된 그래프/시리즈를 표시하는 방법을 잘 모르는 경우이 질문의 목적에 부합합니다. 간단히 말해, 생성 된 그래프를 J 대화 상자에 임베드하는 방법을 모르겠습니다. –

관련 문제