首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MenuBar切换面板

使用MenuBar切换面板
EN

Stack Overflow用户
提问于 2012-10-20 22:25:14
回答 2查看 1.2K关注 0票数 1

我已经写了一些代码,旨在创建一个表,并在该表中显示剪贴板数据(这将从excel中复制)。

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

另外,我编写它的目的是为了让面板(在其中显示表格)能够根据任何未来的菜单按钮进行切换,这可能会导致下面显示一个完全不同的面板。

所以我有这个DisplayExcelData类,它实现了一个MainPage接口(它包含一个init方法)。当单击菜单项时,它在扩展的menubar类中激发一个操作事件,该事件向内容窗格提供与该菜单项相关联的MainPage界面(在本例中,当单击“从DisplayExcelData导入”时,将其提供给内容窗格),然后调用init并将其添加到内容窗格中。

当程序启动时未选择任何内容时,它将缺省为InitialScreen类。

DisplayExcelData类如下所示:

代码语言:javascript
复制
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中,我有

代码语言:javascript
复制
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类作为初始屏幕,它works...it采取的excel数据在剪贴板上,并显示在表中的screen...if然而,我坚持这个表显示时,我点击的MenuItem,它只是显示一个空白屏幕。当我调试时,检查mainPanel在it...it中有什么包含正确的TableModel和Excel数据,包含在它不会显示的JTable...but中...我正在绞尽脑汁地解释为什么……

有人能帮上忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-21 03:08:42

  • 我不建议扩展JFrame
  • 使用Anonymous inner class listeners而不是实现ActionListener (除非ActionListener必须可以被其他类访问)

至于你的实际问题:

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

代码语言:javascript
复制
 contentPane.removeAll();//remove
 setPanelFromMenuBar();//add

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

或者也可以看看CardLayout,它允许通过CardLayout#show(...)JComponentJPanel之间进行切换

票数 4
EN

Stack Overflow用户

发布于 2012-11-13 19:18:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12989388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档