1

我编写了一些代码,旨在创建一个表并在该表中显示剪贴板数据(将从 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...但它不会显示...我正在扯掉我的头发为什么...

任何人都可以帮忙吗?

4

2 回答 2

4
  • 我不建议扩展JFrame课程
  • 使用匿名内部类监听器而不是实现ActionListener(除非ActionListener其他类必须可以访问)

至于你的实际问题:

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

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

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

或者看看CardLayout,它允许在JComponents 之间翻转,比如JPanels viaCardLayout#show(...)

于 2012-10-20T19:08:41.813 回答
0

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

于 2012-11-13T11:18:24.560 回答