0

Hi this is a bit of a basic question. In my code I create a gui in a constructor then nest a ActionListener class to handle button changes. This code will create the gui and the action listener runs through the actionPerformed method correctly. However, I've tried multiple ways to change the panel in the gui but I feel like the way I have the program set up it is not possible for this to work. Sorry if this is a repeat but after searching for a while on S.O. I haven't found a good example that would help me with my problem.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

import org.math.plot.Plot2DPanel;
import org.math.plot.plotObjects.BaseLabel;

public class GraphGui extends JFrame {

//default width and height of the GUI
private static final int WIDTH = 1200;
private static final int HEIGHT = 700;

GraphPlot gp = new GraphPlot();
Plot2DPanel plotPanel =gp.determinePlotToPlot("duration");

/**
 * This is the constructor that initializes the JFrame and the layout of the GUI.
 * The radio buttons are also created here and grouped accordingly.
 */
public GraphGui() {
    //title of GUI
    setTitle("VibeTech Graph Gui");

    //First JRadioButton for date vs duration
    JRadioButton durToDate = new JRadioButton("Duration vs. Date");
    durToDate.addActionListener(new RadioButtonListener());
    durToDate.setActionCommand("duration");
    durToDate.setSelected(true);

    //JRadioButton for weight vs date
    JRadioButton weightToDate = new JRadioButton("Weight vs. Date");
    weightToDate.addActionListener(new RadioButtonListener());
    weightToDate.setActionCommand("weight");

    //JRadioButton for plan type vs date
    JRadioButton planToDate = new JRadioButton("Plan vs. Date");
    planToDate.addActionListener(new RadioButtonListener());
    planToDate.setActionCommand("level");

    //button group of the buttons to display them as one group
    ButtonGroup group = new ButtonGroup();
    group.add(planToDate);
    group.add(weightToDate);
    group.add(durToDate);

    //create JPanel to add objects to
    JPanel jplRadio = new JPanel();
    jplRadio.setLayout(new GridLayout(0, 1));
    //add radio buttons
    jplRadio.add(planToDate);
    jplRadio.add(weightToDate);
    jplRadio.add(durToDate);

    Plot2DPanel dvt = new Plot2DPanel();
    dvt.addLinePlot("Duration over Time", gp.getDate(), gp.getDuration());
    BaseLabel title = new BaseLabel("Duration over Time", Color.RED,
            0.5, 1.1);
    title.setFont(new Font("Courier", Font.BOLD, 20));
    dvt.addPlotable(title);
    dvt.setAxisLabels("Time", "Duration");

    setLayout(new BorderLayout());
    add(jplRadio, BorderLayout.WEST);
    add(plotPanel, BorderLayout.EAST);

    setSize(WIDTH, HEIGHT);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

//main method to run program
public static void main(String [ ] args)
{
    //create new GUI
    @SuppressWarnings("unused")
    GraphGui test = new GraphGui();
}

//create a radio button listener to switch graphs on button press
class RadioButtonListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("duration")) {
            plotPanel = gp.determinePlotToPlot("duration");
        } else if (e.getActionCommand().equals("weight")) {
            plotPanel = gp.determinePlotToPlot("weight");
        } else if (e.getActionCommand().equals("level")) {
            plotPanel = gp.determinePlotToPlot("level");
        }
        //here is where I tried to do removes, adds, and validates but
        //I have trouble getting to the frame itself to remove the JPanel
        //component. I think this is a setup problem.
    }
}
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
swhite
  • 471
  • 1
  • 6
  • 11

2 Answers2

2

You would need to add the panel and revalidate/repaint the JFrame for it to appear:

add(plotPanel, BorderLayout.EAST);
revalidate();
repaint();

Better to use CardLayout to manage this type of functionality.

Reimeus
  • 158,255
  • 15
  • 216
  • 276
  • Here is an [example](http://stackoverflow.com/questions/8248152/jframe-removing-jpanels-and-adding-a-new-jpanel?answertab=oldest#tab-top) Would suggest having a look at `CardLayout` though. – Reimeus Apr 01 '13 at 16:48
  • Thanks I will look at the example that Juvanis posted but this did work for me. However CardLayout does look a lot easier. thanks – swhite Apr 01 '13 at 16:53
1

Try using CardLayout for switching between panels. Here is my solution for a similar question: https://stackoverflow.com/a/9377623/544983

Community
  • 1
  • 1
Juvanis
  • 25,802
  • 5
  • 69
  • 87