当前位置: 首页 > 知识库问答 >
问题:

SwingGUI冻结

裴硕
2023-03-14

我一直试图使这个应用程序,将产生一个折线图后,我点击"添加新数据项"按钮。现在,在我点击按钮后,什么都没发生(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个答案

宋英杰
2023-03-14

我不认为你的GUI是冻结的,只是没有人告诉你要改变。添加ChartPanel后,是否尝试在框架上调用repaint()

关于线程,如果actionPerformed中的代码不是即时的,您可能应该在单独的线程中执行。

昌山
2023-03-14

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

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

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

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

在这里或这里看到一些工作示例

 类似资料:
  • 问题内容: 这是一个片段 我正在使用和作为文本框。文本框应显示“ Hello”,然后等待一秒钟,但是,当我尝试执行此操作时,它会等待一秒钟,然后放置“ Hello”一词,这不是我想要的。 我不确定为什么会这样,因为我将其按逻辑顺序放置。如果有人可以帮助我,那就太好了。 编辑: 有谁知道替代方案,所以我可以使用“延迟”效果吗? 问题答案: 永远不要从Swing事件线程中调用Thread.sleep(

  • 问题内容: 我正在尝试使用Swing和ACM交互程序制作一个非常简单的程序。它直接从课堂讲义中获取,但在我的计算机上不起作用。当我运行它时,它可以正常运行约半秒钟,然后短暂闪烁,重新加载,然后所有按钮和文本字段功能都丢失。这是代码: 如果有帮助,我将在运行Mac OSX 10.8.4的2010年中的Mac Pro上将Java SE 1.6与Eclipse Helios Service Releas

  • 当数据被不可变地借用时,它还会冻结(freeze)。已冻结(frozen)数据无法通过原始对象来修改,直到指向这些数据的所有引用离开作用域为止。 fn main() { let mut _mutable_integer = 7i32; { // 借用 `_mutable_integer` let _large_integer = &_mutable_

  • 『冻结』你的代码是指创建单个可执行文件,文件里包含所有程序代码以及 Python 解释器。 像 Dropbox、星战前夜、文明 4 和 BitTorrent 客户端都是如此。 进行这种分发的好处是你的用户不需要安装所要求的 Python 版本(或其他)即可直接运行你的应用程序。 在 Windows 上,甚至许多 Linux发行版和 OS X,系统自带的 Python 版本总是不尽如人意,此时这种分

  • freezePanes(int $row, int $column): self int $row freezePanes(1, 0); // 冻结第一行 freezePanes(0, 1); // 冻结第一列 freezePanes(1, 1); // 冻结第一行和第一列

  • 我正在使用媒体编解码器在jelly-bean上获取. mp4文件并在logcat中获取此文件 谁能告诉我这是什么吗?如何解决呢?