Swing GUI冻结

时间:2017-05-23 14:19:26

标签: java swing jfreechart

我一直试图制作这个应用程序,在我点击"添加新数据项"按钮。现在,在我点击按钮后,没有任何反应(gui冻结),在我最大化框架后,图形出现在框架内部,这说明我的程序工作,但我不知道为什么我的gui会冻结。 我已经看到了类似的问题,人们回答说必须引入一个新的线程来处理不同的设备,我也尝试过,但它仍然没有工作,只是让它变得更糟。有谁知道我是什么样的错误在这里制作?这是我的代码:

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

}

谢谢!

2 个答案:

答案 0 :(得分:3)

我不认为你的GUI是冻结的,它只是没有被告知改变。在添加repaint()后,您是否尝试在相框上调用ChartPanel

关于线程,如果actionPerformed内的代码小于即时代码,你应该在一个单独的线程中进行。

答案 1 :(得分:3)

问题是按下按钮时图表被添加到框架的内容窗格中。到这种情况发生时,框架已经可见,如果您向已经显示的容器添加一个组件,那么您需要重新验证并重新绘制容器,即:

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

然而,这不是典型的Swing应用程序的工作方式。正确的方法是在使顶层容器(框架或对话框)可见之前放置所有组件,然后使用组件模型。

因此,在您的actionPerformed()方法实施中,您应该更改图表的模型,然后视图会被通知并重新绘制,不需要您采取进一步的操作。

查看一些工作示例herehere