Java 如何纠正这个计划?

Java 如何纠正这个计划?,java,swing,jfreechart,Java,Swing,Jfreechart,这是一个显示饼图的程序。我还有一个按钮。但是我写的程序创建了两个独立的框架,一个用于饼图,另一个用于按钮。如何将按钮和饼图放在同一个框架上??你能帮我修改一下程序吗 import java.awt.*; import org.jfree.chart.*; import org.jfree.chart.title.*; import org.jfree.data.general.DefaultPieDataset; import org.jfree.ui.*; import java.i

这是一个显示饼图的程序。我还有一个按钮。但是我写的程序创建了两个独立的框架,一个用于饼图,另一个用于按钮。如何将按钮和饼图放在同一个框架上??你能帮我修改一下程序吗

import java.awt.*;

import org.jfree.chart.*;

import org.jfree.chart.title.*;

import org.jfree.data.general.DefaultPieDataset;

import org.jfree.ui.*;

import java.io.*;

import javax.swing.*;

import java.awt.event.*;

import javax.swing.filechooser.*;

public class Pie{

 public static void getFile(File f)
{

    System.out.println("File is: "+f.getName());

}

public static void main(String[] args)
{

   JPanel panel=new JPanel();

    panel.setLayout(null);

    JButton b=new JButton("Open File");

    b.addActionListener(new ActionListener()

 {

        public void actionPerformed(ActionEvent e)

  {

        JFileChooser chooser=new JFileChooser();

        int ret = chooser.showDialog(null, "Open file");

        if (ret == JFileChooser.APPROVE_OPTION)

        {

        File file = chooser.getSelectedFile();

        getFile(file);

        }

       }

    }
);
       b.setBounds(50,40,100,35);

       panel.add(b);

    DefaultPieDataset pieDataset = new DefaultPieDataset();


  ieDataset.setValue("A", new Integer(10));

  pieDataset.setValue("B", new Integer(20));

  pieDataset.setValue("C", new Integer(30));

  pieDataset.setValue("D", new Integer(10));

  pieDataset.setValue("E", new Integer(20));

  pieDataset.setValue("F", new Integer(10));

  FreeChart chart = ChartFactory.createPieChart("Pie Chart using JFreeChart", pieDataset, true,true,true);

  ChartFrame frame1=new ChartFrame("Pie Chart",chart);

  frame1.add(panel);

  frame1.setVisible(true);

  frame1.setSize(600,600);

 }

}
更换这条线

  ChartFrame frame1=new ChartFrame("Pie Chart",chart);

请告诉我结果

  • 除非确有必要,否则不要使用绝对布局。依赖布局管理器、pref/min/max size和约束来确定零部件的大小和位置。这也意味着您不应该在组件上调用setBounds/setSize/setLocation,让布局管理器为您这样做
  • 从EDT初始化UI(事件调度)
  • 您当前没有对FileChooser执行任何操作
  • 尽量避免使用
    static
    而改用
    newsomething()
  • 不要使用
    newinteger()
    ,而是使用
    Integer.valueOf()
    (这适用于所有基本包装类,Boolean、Short、Long等)
  • 我不知道你是如何得到两帧的,但是我通过这种方式修改了你的代码

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.data.general.DefaultPieDataset;
    
    public class Pie {
    
        private static void initUI() {
            JPanel panel = new JPanel(new FlowLayout());
            final JButton b = new JButton("Open File");
            b.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JFileChooser chooser = new JFileChooser();
                    int ret = chooser.showDialog(b, "Open file");
                    if (ret == JFileChooser.APPROVE_OPTION) {
                        File file = chooser.getSelectedFile();
                        // Don't know what you want to do
                    }
                }
    
            });
            panel.add(b);
            DefaultPieDataset pieDataset = new DefaultPieDataset();
            pieDataset.setValue("A", Integer.valueOf(10));
            pieDataset.setValue("B", Integer.valueOf(20));
            pieDataset.setValue("C", Integer.valueOf(30));
            pieDataset.setValue("D", Integer.valueOf(10));
            pieDataset.setValue("E", Integer.valueOf(20));
            pieDataset.setValue("F", Integer.valueOf(10));
            JFreeChart chart = ChartFactory.createPieChart("Pie Chart using JFreeChart", pieDataset, true, true, true);
            JFrame frame1 = new JFrame();
            frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            ChartPanel chartPanel = new ChartPanel(chart);
            // chartPanel.setPreferredSize(new Dimension(600, 600));
            frame1.getContentPane().add(chartPanel, BorderLayout.CENTER);
            frame1.getContentPane().add(panel, BorderLayout.SOUTH);
            frame1.pack();
            frame1.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    initUI();
                }
            });
        }
    
    }
    

    有一个名为
    ChartPanel
    的类。它是
    JPanel
    类的一个子类

    JPanel chartPanel = new ChartPanel(chart);
    

    然后可以将此面板添加到框架中。希望这有助于……。

    解释这一点
    ChartFrame1=新的ChartFrame(“饼图”,图表)。我认为您实际上正在创建两个框架…第一个参数是标题,第二个是JFreeChart obejct。我收到此错误消息“类型容器中的方法add(组件)不适用于参数(JFreeChart)”,然后通过编写panel.add(b)在panel中不添加按钮。一帧一帧地直接添加按钮。添加(b)。明白了!非常感谢。我还有一个疑问。如何在框架上布局组件?该按钮显示在饼图的右上方。我想要按钮和饼图并排。你可以将布局设置为flowlayout。我正在尝试掌握程序的诀窍。我实际上需要的是一个框架,在这个框架中我可以输入一个文本文件[假设输入文本文件有一组整数值]。阅读文本文件并绘制一个折线图。@user1430719,好的,因此您必须在操作侦听器中对其进行编码,或者最好将其包装为一个扩展了
    AbstractAction
    的类,并将该类传递给
    JButton
    JPanel chartPanel = new ChartPanel(chart);