使用MenuBar切换面板

时间:2012-10-20 14:25:14

标签: java swing awt jpanel mixing

我编写了一些代码,用于创建表格并在该表格中显示剪贴板数据(将从excel中复制)。

所以我在菜单栏“从Excel导入”中有一个菜单项,点击它时将获取剪贴板中的任何Excel数据并在下面的面板中显示一个表。

另外,我已经写好了,以便面板(显示表格)能够根据以后的菜单按钮进行切换,这可能会导致下面显示完全不同的面板。

所以我有这个DisplayExcelData类实现了一个MainPage接口(包含一个init方法)。单击菜单项时,它会在扩展的菜单栏类中触发一个操作事件,该类向内容窗格提供与该菜单项关联的MainPage接口(在这种情况下,DisplayExcelData被提供给内容窗格当“单击从Excel导入”时,将调用init并将其添加到内容窗格中。

当程序启动并且未选择任何内容时,它默认为InitialScreen类。

DisplayExcelData类如下所示:

public class DisplayExcelData implements MainPageIF
{
    private ExcelTableModel tm = null;
    private Table table = new Table();
    private JPanel thisPanel = new Panel();

    public DisplayExcelData () 
    {
        super();
        thisPanel.setLayout(new BorderLayout());
    }

    @Override
    public void init()
    {
                //the test data I have been using is only 2 columns, so I'm just using
                //these as test columns at the moment
        tm = new ExcelTableModel("First, Second");
        table.setModel(tm);

        thisPanel.add(table, BorderLayout.CENTER);
    }

    @Override
    public JPanel getPanel()
    {
        return thisPanel;
    }
}

ExcelTableModel获取剪贴板中的数据并将其转换为TableModel

然后,在contentPane中,我有

public MainFrame()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(50, 50, 800, 500);
    compInit();
}

private void compInit() 
{
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    contentPane.setBackground(new Color(0,0,0));
    setContentPane(contentPane);

            //mf is the menu bar which is a class variable
    MenuBar menuBar = mf.getMenuBar();

    setPanelFromMenuBar();

    setMenuBar(menuBar);
}

private void setPanelFromMenuBar()
{
    MainPageIF page = mf.getPage();
    if (page == null)
    {
        page = new InitialScreen();
    }
    page.init();
            //mainPanel is a class variable
    mainPanel = page.getPanel();

    mainPanel.setVisible(true);
    contentPane.add(mainPanel, BorderLayout.CENTER);
}

@Override
public void actionPerformed(ActionEvent evt)
{
    Object source = evt.getSource();
    if (source instanceof MenuItem)
    {
        contentPane.removeAll();
        setPanelFromMenuBar();
        getContentPane().doLayout();
            update(getGraphics());
    }
}

如果我更改代码,那么我使用DisplayExcelData类作为初始屏幕启动程序,它可以工作......它将剪贴板中的excel数据显示在屏幕上的表格中。 ..但是,我坚持在点击MenuItem时显示此表格,它只显示一个空白屏幕。当我调试并检查mainPanel中包含的内容时...它包含带有Excel数据的正确TableModel,包含在JTable中......但它不会显示...为什么......我正在撕开我的头发......

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

至于你的实际问题:

在删除组件并添加新组件后,尝试在revalidate()实例上调用repaint()JFrame

 contentPane.removeAll();//remove
 setPanelFromMenuBar();//add

 revalidate();//refresh ui and layout
 repaint();

或者,请查看CardLayout,该CardLayout#show(...)允许JComponent通过{{3}}

翻转JPanel之间的{{1}}

答案 1 :(得分:0)

我遇到的问题是我已经实现了TableModel,但没有触发任何表更改方法。我写了这些方法并在最后重新验证了表,并让它再次运行。谢谢你的帮助。