1

テーブルを作成し、そのテーブルにクリップボード データ (Excel からコピーされる) を表示するように設計されたコードをいくつか書きました。

そのため、メニューバーの「Excelからインポート」に1つのメニュー項目があり、クリックするとクリップボードにあるExcelデータがすべて取得され、下のパネルに表が表示されます。

また、(テーブルが表示される) パネルは、下に表示されるまったく別のパネルにつながる可能性がある将来のメニュー ボタンに応じて切り替えることができるように記述しました。

だから私はインターフェース(initメソッドを含む)DisplayExcelDataを実装するこのクラスを持っています。MainPageメニュー項目がクリックされると、拡張されたメニューバー クラスでアクション イベントが発生し、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ますが、空白の画面が表示されるだけです。デバッグして、何が入っているかを確認すると... Excelデータに含まれるmainPanel正しいものが含まれています...しかし、表示されません...理由については髪の毛を引き裂いています...TableModelJTable

誰でも助けることができますか?

4

2 に答える 2

4
  • JFrameクラスの延長はお勧めしません
  • 実装する代わりに、匿名の内部クラス リスナーを使用します (他のクラスからアクセスできる必要があるActionListener場合を除く)。ActionListener

あなたの実際の問題については:

コンポーネントを削除して新しいコンポーネントを追加した後、インスタンスでand をrevalidate()呼び出してみてください。repaint()JFrame

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

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

または、別の方法として、のようにを介してs を切り替えることができるCardLayoutを見てください。JComponentJPanelCardLayout#show(...)

于 2012-10-20T19:08:41.813 に答える
0

私が抱えていた問題は、TableModel を実装したが、テーブル変更メソッドを起動していなかったことです。これらのメソッドを作成し、最後にテーブルを再検証して、再び機能するようにしました。ご助力いただきありがとうございます。

于 2012-11-13T11:18:24.560 に答える