【问题标题】:Replacing a JPanel with a different JPanel用不同的 JPanel 替换 JPanel
【发布时间】:2013-04-01 16:35:10
【问题描述】:

您好,这是一个基本问题。在我的代码中,我在构造函数中创建了一个 gui,然后嵌套了一个 ActionListener 类来处理按钮更改。此代码将创建 gui 并且动作侦听器正确运行 actionPerformed 方法。但是,我尝试了多种方法来更改 gui 中的面板,但我觉得我设置程序的方式不可能让它工作。抱歉,如果这是重复但在 S.O. 上搜索了一段时间之后。我还没有找到一个很好的例子来帮助我解决我的问题。

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

【问题讨论】:

  • 什么是 gp.determinePlotToPlot()?
  • 它是一个单独的类,用于确定应该显示哪个新面板

标签: java swing jpanel actionlistener


【解决方案1】:

您需要添加面板和revalidate/repaint JFrame 才能显示:

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

最好使用CardLayout 来管理此类功能。

【讨论】:

  • 这里是example 不过建议看看CardLayout
  • 谢谢,我会看一下 Juvanis 发布的示例,但这确实对我有用。然而 CardLayout 看起来确实容易多了。谢谢
【解决方案2】:

尝试使用CardLayout 在面板之间切换。这是我对类似问题的解决方案:https://stackoverflow.com/a/9377623/544983

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2023-03-11
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多