【问题标题】:Switching panels with MenuBar使用 MenuBar 切换面板
【发布时间】:2012-10-20 14:25:14
【问题描述】:

我编写了一些代码,旨在创建一个表并在该表中显示剪贴板数据(将从 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 中包含的内容时...它包含正确的TableModel 和Excel 数据,包含在JTable 中...但它不会显示...我在扯我的头发至于为什么……

谁能帮忙?

【问题讨论】:

标签: java swing awt jpanel mixing


【解决方案1】:

至于你的实际问题:

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

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

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

或者查看CardLayout,它允许在JComponents 之间翻转,如JPanels 通过CardLayout#show(...)s

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多