我用Netbeans创建了一个JFrame,并在其中放入了两个JPanels(mainPanel和secondPanel)。
当我使用JFrame的菜单栏打开文件时,该项目的另一类返回一个JPanel。
如何更新mainPanel,以便显示从项目的其他类返回的JPanel?
谢谢。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package nysemarketpick;

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

/**
 *
 * @author skiabox
 */
public class MainForm extends JFrame {

/**
 * Creates new form MainForm
 */
public MainForm() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    fileChooser = new javax.swing.JFileChooser();
    toolbar = new javax.swing.JToolBar();
    shortButton = new javax.swing.JButton();
    jSeparator1 = new javax.swing.JToolBar.Separator();
    midButton = new javax.swing.JButton();
    jSeparator2 = new javax.swing.JToolBar.Separator();
    longButton = new javax.swing.JButton();
    mainPanel = new javax.swing.JPanel();
    secondPanel = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    jMenuBar1 = new javax.swing.JMenuBar();
    fileMenu = new javax.swing.JMenu();
    Open = new javax.swing.JMenuItem();
    Exit = new javax.swing.JMenuItem();
    optionsMenu = new javax.swing.JMenu();
    shortItem = new javax.swing.JMenuItem();
    midItem = new javax.swing.JMenuItem();
    longItem = new javax.swing.JMenuItem();
    toolsMenu = new javax.swing.JMenu();
    helpMenu = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Nyse Stock Pick");

    toolbar.setFloatable(false);
    toolbar.setRollover(true);

    shortButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/nysemarketpick/S-orange-icon.png"))); // NOI18N
    shortButton.setText("Short-Term");
    shortButton.setFocusable(false);
    shortButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    shortButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
    toolbar.add(shortButton);
    toolbar.add(jSeparator1);

    midButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/nysemarketpick/M-lg-icon.png"))); // NOI18N
    midButton.setText("Mid-Term");
    midButton.setFocusable(false);
    midButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    midButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
    toolbar.add(midButton);
    toolbar.add(jSeparator2);

    longButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/nysemarketpick/L-blue-icon.png"))); // NOI18N
    longButton.setText("Long-Term");
    longButton.setFocusable(false);
    longButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    longButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
    toolbar.add(longButton);

    org.jdesktop.layout.GroupLayout mainPanelLayout = new org.jdesktop.layout.GroupLayout(mainPanel);
    mainPanel.setLayout(mainPanelLayout);
    mainPanelLayout.setHorizontalGroup(
        mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(0, 0, Short.MAX_VALUE)
    );
    mainPanelLayout.setVerticalGroup(
        mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(0, 537, Short.MAX_VALUE)
    );

    org.jdesktop.layout.GroupLayout secondPanelLayout = new org.jdesktop.layout.GroupLayout(secondPanel);
    secondPanel.setLayout(secondPanelLayout);
    secondPanelLayout.setHorizontalGroup(
        secondPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(0, 240, Short.MAX_VALUE)
    );
    secondPanelLayout.setVerticalGroup(
        secondPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(0, 543, Short.MAX_VALUE)
    );

    jLabel1.setText("World Market Status");
    jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);

    fileMenu.setText("File");

    Open.setText("Open");
    Open.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            OpenActionPerformed(evt);
        }
    });
    fileMenu.add(Open);

    Exit.setText(" Exit");
    Exit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            ExitActionPerformed(evt);
        }
    });
    fileMenu.add(Exit);

    jMenuBar1.add(fileMenu);

    optionsMenu.setText("Options");

    shortItem.setText("Short-Term Moving Average");
    optionsMenu.add(shortItem);

    midItem.setText("Mid-Term Moving Average");
    optionsMenu.add(midItem);

    longItem.setText("Long-Term Moving Average");
    optionsMenu.add(longItem);

    jMenuBar1.add(optionsMenu);

    toolsMenu.setText("Tools");
    jMenuBar1.add(toolsMenu);

    helpMenu.setText("Help");
    jMenuBar1.add(helpMenu);

    setJMenuBar(jMenuBar1);

    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(toolbar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 762, Short.MAX_VALUE)
                    .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 182, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(354, 354, 354))
                .add(layout.createSequentialGroup()
                    .add(6, 6, 6)
                    .add(mainPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(18, 18, 18)
                    .add(secondPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(351, 351, 351))))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                .add(toolbar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(jLabel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .add(12, 12, 12)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(mainPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(secondPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(33, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>

private void ExitActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    System.exit(0);
}

private void OpenActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    int returnVal = fileChooser.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION)
    {
        File file = fileChooser.getSelectedFile();


        //What to do with the file
        //remove current chart
        mainPanel.removeAll();
        //add new chart
        PriceVolumeChart chart = new PriceVolumeChart(file.getAbsolutePath());

        mainPanel.add(chart.getChart());
        mainPanel.validate();
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /*
     * Set the Nimbus look and feel
     */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /*
     * If Nimbus (introduced in Java SE 6) is not available, stay with the
     * default look and feel. For details see
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /*
     * Create and display the form
     */
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new MainForm().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
private javax.swing.JMenuItem Exit;
private javax.swing.JMenuItem Open;
private javax.swing.JFileChooser fileChooser;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenu helpMenu;
private javax.swing.JLabel jLabel1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JToolBar.Separator jSeparator1;
private javax.swing.JToolBar.Separator jSeparator2;
private javax.swing.JButton longButton;
private javax.swing.JMenuItem longItem;
private javax.swing.JPanel mainPanel;
private javax.swing.JButton midButton;
private javax.swing.JMenuItem midItem;
private javax.swing.JMenu optionsMenu;
private javax.swing.JPanel secondPanel;
private javax.swing.JButton shortButton;
private javax.swing.JMenuItem shortItem;
private javax.swing.JToolBar toolbar;
private javax.swing.JMenu toolsMenu;
// End of variables declaration
}



public class PriceVolumeChart
{
static FileReader fileReader;
static File file;
static TimeSeries t1 = new TimeSeries("49-day moving average");
static String filename;

JPanel myPanel;

/**
 * Default constructor
 */
public PriceVolumeChart(String absoluteFilePath)
{
    //super(title);
    filename = absoluteFilePath;
    //JPanel panel = createDemoPanel();
    //panel.setPreferredSize(new Dimension(500, 270));
    //setContentPane(panel);
    myPanel = createDemoPanel();
    myPanel.setPreferredSize(new Dimension(500, 270));
}


//create price dataset
//hard-coded here
private static OHLCDataset createPriceDataset(String filename)
{
    //the following data is taken from http://finance.yahoo.com/
    //for demo purposes...


    OHLCSeries s1 = new OHLCSeries(filename);

    try {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String inputLine;
        in.readLine();
        while ((inputLine = in.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(inputLine, ",");
            Date date       = df.parse( st.nextToken() );
            double open     = Double.parseDouble( st.nextToken() );
            double high     = Double.parseDouble( st.nextToken() );
            double low      = Double.parseDouble( st.nextToken() );
            double close    = Double.parseDouble( st.nextToken() );
            double volume   = Double.parseDouble( st.nextToken() );
            //double adjClose = Double.parseDouble( st.nextToken() );
            s1.add(new Day(date), open, high, low, close);
            t1.add(new Day(date), close);
        }
        in.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }



    OHLCSeriesCollection dataset = new OHLCSeriesCollection();
    dataset.addSeries(s1);

    return dataset;
}


//create volume dataset
private static IntervalXYDataset createVolumeDataset(String filename)
{
    //create dataset 2...
    TimeSeries s1 = new TimeSeries("Volume");

    try {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String inputLine;
        in.readLine();
        while ((inputLine = in.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(inputLine, ",");
            Date date = df.parse( st.nextToken() );
            st.nextToken();
            st.nextToken();
            st.nextToken();
            st.nextToken();
            double volume   = Double.parseDouble( st.nextToken() );
            //double adjClose = Double.parseDouble( st.nextToken() );
            s1.add(new Day(date), volume);
        }
        in.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }



    return new TimeSeriesCollection(s1);
}


private static JFreeChart createCombinedChart()
{
    OHLCDataset data1 = createPriceDataset(filename);

    XYItemRenderer renderer1 = new HighLowRenderer();
    renderer1.setBaseToolTipGenerator(new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0.00")));
    renderer1.setSeriesPaint(0, Color.blue);
    DateAxis domainAxis = new DateAxis("Date");
    NumberAxis rangeAxis = new NumberAxis("Price");
    rangeAxis.setNumberFormatOverride(new DecimalFormat("$0.00"));
    rangeAxis.setAutoRange(true);
    rangeAxis.setAutoRangeIncludesZero(false);
    XYPlot plot1 = new XYPlot(data1, domainAxis, rangeAxis, renderer1);
    plot1.setBackgroundPaint(Color.lightGray);
    plot1.setDomainGridlinePaint(Color.white);
    plot1.setRangeGridlinePaint(Color.white);
    plot1.setRangePannable(true);

    //Overlay the Long-Term Trend Indicator
    TimeSeries dataset3 = MovingAverage.createMovingAverage(t1, "LT", 49, 49);
    TimeSeriesCollection collection = new TimeSeriesCollection();
    collection.addSeries(dataset3);
    plot1.setDataset(1, collection);
    plot1.setRenderer(1, new StandardXYItemRenderer());



    //add a second dataset (volume) and renderer
    IntervalXYDataset data2 = createVolumeDataset(filename);
    XYBarRenderer renderer2 = new XYBarRenderer();
    renderer2.setDrawBarOutline(false);
    renderer2.setBaseToolTipGenerator(new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0,000.00")));
    renderer2.setSeriesPaint(0, Color.red);

    XYPlot plot2 = new XYPlot(data2, null, new NumberAxis("Volume"), renderer2);
    plot2.setBackgroundPaint(Color.lightGray);
    plot2.setDomainGridlinePaint(Color.white);
    plot2.setRangeGridlinePaint(Color.white);

    //middle pane oscillators
    TimeSeries threeMA = MovingAverage.createMovingAverage(t1, "SL1", 3, 3);
    TimeSeries tenMA = MovingAverage.createMovingAverage(t1, "SL2", 10, 10);

    List<TimeSeriesDataItem> threeItemsList = new ArrayList<TimeSeriesDataItem>();
    List<TimeSeriesDataItem> tenItemsList = new ArrayList<TimeSeriesDataItem>();
    threeItemsList = threeMA.getItems();
    tenItemsList = tenMA.getItems();

    for (TimeSeriesDataItem item: threeItemsList)
    {
        System.out.println("three" + item.getValue().doubleValue() + " " + item.getPeriod().toString());
    }

    for (TimeSeriesDataItem item: tenItemsList)
    {
        System.out.println("ten" + item.getValue().doubleValue() + " " + item.getPeriod().toString());
    }

    TimeSeries slDataset = new TimeSeries("SL");
    int i = 0;
    //List<TimeSeriesDataItem> slItemsList = new ArrayList<TimeSeriesDataItem>();
    TimeSeriesDataItem myItem;
    Day threeDate;

    for (TimeSeriesDataItem item: threeItemsList)
    {
        //RegularTimePeriod variable = item.getPeriod();
        if (item.getPeriod().compareTo(tenItemsList.get(0).getPeriod()) < 0)
        {
            continue;
        }
        else
        {
            double result = item.getValue().doubleValue() - tenItemsList.get(i).getValue().doubleValue();
            Day currentDay = (Day)item.getPeriod();
            myItem = new TimeSeriesDataItem(currentDay, result);
            slDataset.add(myItem);

            //slItemsList.add(myItem);
            i++;
        }


    }

    System.out.println("slDataset count : " + slDataset.getItemCount());



    TimeSeriesCollection collectionSL = new TimeSeriesCollection();
    collectionSL.addSeries(slDataset);

    //create middle line (ML)
    XYLineAndShapeRenderer rendererFinal = new XYLineAndShapeRenderer(true, false);
    rendererFinal.setBaseShapesVisible(false);
    TimeSeries ml = MovingAverage.createMovingAverage(slDataset, "ML", 16, 16);
    TimeSeriesCollection collectionML = new TimeSeriesCollection();
    collectionML.addSeries(ml);

    DateAxis domainMiddleAxis = new DateAxis();
    NumberAxis rangeMiddleAxis = new NumberAxis("Value");
    StandardXYItemRenderer rendererMiddle = new StandardXYItemRenderer();
    rendererMiddle.setBaseShapesVisible(false);
    //rendererMiddle.setBaseToolTipGenerator(new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0.00")));
    XYPlot plot3 = new XYPlot(collectionSL, domainMiddleAxis, rangeMiddleAxis, rendererFinal);
    plot3.setBackgroundPaint(Color.lightGray);
    plot3.setDomainGridlinePaint(Color.white);
    plot3.setRangeGridlinePaint(Color.white);
    plot3.setRangePannable(true);
    plot3.setDomainPannable(true);



    //plot3.setDataset(collectionSL);
    //plot3.setRenderer(new StandardXYItemRenderer());
    //StandardXYItemRenderer rendererML = new StandardXYItemRenderer();
    plot3.setDataset(1, collectionML);
    plot3.setRenderer(1, rendererMiddle);
    //XYLineAndShapeRenderer r = new XYLineAndShapeRenderer();
    //r.setBaseShapesVisible(false);
    //plot3.setRenderer(1, r);



    CombinedDomainXYPlot cplot = new CombinedDomainXYPlot(domainAxis);
    cplot.add(plot1, 3);
    cplot.add(plot3, 2);
    cplot.add(plot2, 2);
    cplot.setGap(8.0);
    cplot.setDomainGridlinePaint(Color.white);
    cplot.setDomainGridlinesVisible(true);
    cplot.setDomainPannable(true);


    //return the new combined chart
    JFreeChart chart = new JFreeChart("Sun Microsystems (SUNW)", JFreeChart.DEFAULT_TITLE_FONT, cplot, true);


    ChartUtilities.applyCurrentTheme(chart);
    renderer2.setShadowVisible(false);
    renderer2.setBarPainter(new StandardXYBarPainter());

    return chart;
}


//create a panel
public static JPanel createDemoPanel()
{
    JFreeChart chart = createCombinedChart();
    ChartPanel panel = new ChartPanel(chart);
    panel.setMouseWheelEnabled(true);

    return panel;
}

//return chart
public JPanel getChart()
{
    return myPanel;
}

}

最佳答案

似乎您想使用mainPanel作为包含图表的面板。而不是将面板分配给mainPanel,请尝试在其中添加和删除面板。使其成为容器,不要尝试通过将另一个Jpanel分配给变量来更改它。

在方法“ private void OpenActionPerformed(java.awt.event.ActionEvent evt)”中尝试更改以下内容:

//What to do with the file
PriceVolumeChart chart = new PriceVolumeChart(file.getAbsolutePath());
mainPanel = chart.getChart();


至:

//remove current chart
mainPanel.removeAll(); //assuming you have nothing else in main panel other than a chart panel;
//add new chart
PriceVolumeChart chart = new PriceVolumeChart(file.getAbsolutePath());
mainPanel.add(chart);
mainPanel.validate();


注意注意:我本人并没有自己。这个想法来自这里:Change a JPanel dynamically based on JRadioButton

我将其修改为我认为适合您的代码的位置。
我只是使用与原始问题相同的代码,因此也许您也应该尝试答案中建议的内容,因为它看起来像是正确的方法。

编辑:

在您对代码进行更改之后,正如您所评论的,还添加以下内容:

在功能上

public MainForm() {
    initComponents();
}


组件初始化后,请替换主面板的布局管理器。例如:

public MainForm() {
    initComponents();
    mainPanel.setLayout(new FlowLayout());
}

10-04 13:21