2017-05-23 7 views
0

"Add New Data Item"버튼을 클릭 한 후 꺾은 선형 차트를 생성하는이 응용 프로그램을 만들려고했습니다. 자, 버튼을 클릭 한 후에 아무 일도 일어나지 않습니다. (GUI가 멈 춥니 다.) 그리고 프레임을 최대화 한 후 그래프가 프레임 안에 표시됩니다.이 그래프는 내 프로그램이 작동하지만, GUI가 왜 멈추는 지 모릅니다. 나는 비슷한 질문을 보았고 사람들은 다른 작업을 처리하기 위해 새로운 스레드를 도입해야한다고 응답했으며, 시도해 보았지만 여전히 효과가 없었고, 더 악화되었다. 누구도 내가 만든 실수를 알고있다. 이리? 내 코드는 다음과 같습니다.Swing GUI freeches

import java.awt.BorderLayout; 
import java.util.HashSet; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.xy.DefaultXYDataset; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.ui.RefineryUtilities; 

public class ChartApp implements ActionListener { 

static final JFrame frame = new JFrame("Chart"); 



public ChartApp(){ 


final JButton button = new JButton("Add New Data Item"); 
       button.addActionListener(this); 
frame.setSize(600, 400); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


frame.add(button,BorderLayout.NORTH); 
frame.setVisible(true); 


} 
public static void main(String[] args){ 

    ChartApp app=new ChartApp(); 

} 





      public void actionPerformed(final ActionEvent e) 
      { 

       DefaultXYDataset dataSet = new DefaultXYDataset(); 

       double[][] data = { {1,5,9}, {1, 5, 4} }; 


       dataSet= createDataset(dataSet,data); 

       final JFreeChart chart = ChartFactory.createXYLineChart("Test Chart", 
         "x", "y", dataSet, PlotOrientation.VERTICAL, true, true, 
         false); 

       ChartPanel cp = new ChartPanel(chart); 
        frame.getContentPane().add(cp); 



      } 


private static DefaultXYDataset createDataset(DefaultXYDataset dataSet,double[][]data) { 


    dataSet.addSeries("series1", data); 

    return dataSet; 
} 

} 

고마워요!

답변

3

GUI가 멈추지 않는다고 생각합니다. 변경하지 말라고 말한 것입니다. ChartPanel이 추가 된 후 프레임에 repaint()을 호출 해 보았습니까?

스레드의 경우 actionPerformed 내부의 코드가 인스턴트보다 작 으면 별개의 스레드에서 수행해야합니다.

+0

오 잘 약간의 작업 예를 참조하십시오! – 3xpl0its

3

버튼을 누르면 차트가 프레임의 내용 창에 추가되는 것이 문제입니다. 시간으로이 프레임이 이미 볼 일이 당신이 다음 이미 표시 컨테이너에 구성 요소를 추가 할 경우 재 검증 및 컨테이너를 다시 칠해야하는, 즉 :

frame.add(chartPanel); 
frame.revalidate(); 
frame.repaint(); 

그러나이 방법 전형적인 스윙 응용 프로그램이 아닙니다 공장. 올바른 방법은 최상위 컨테이너 (프레임 또는 대화 상자)를 표시 한 다음 구성 요소 모델을 사용하기 전에 모든 구성 요소를 배치하는 것입니다.

따라서 actionPerformed() 메서드 구현시 차트 모델을 변경해야하며 그 결과보기가 통보되고 다시 그려지기 때문에 별도의 조치가 필요하지 않습니다.

는 그래요 그냥 다시 그리기()를 추가 할 필요가 당신을 method..Thank here 또는 here

+1

관련 예제는 [여기] (https://stackoverflow.com/a/38512314/230513)에서 검토합니다. – trashgod