0
import org.jdesktop.application.SingleFrameApplication;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import org.jdesktop.application.FrameView;

public class Welcome extends FrameView 
{
    SearchPanelClass panel1 = new SearchPanelClass();
    AddMaterialPanel panel2 = new AddMaterialPanel();
    Container container= AutomobileApplication.getApplication().getMainFrame();
    public Welcome(SingleFrameApplication app) 
    {
       super(app);
       initMenu();
}

private class MenuAction implements ActionListener {

private SearchPanelClass panel;
private MenuAction(SearchPanelClass pnl) 
{

    this.panel = pnl;

}
private AddMaterialPanel AddMaterialPan;
private MenuAction(AddMaterialPanel pnl) 
{
    this.AddMaterialPan = pnl;
}

public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();
    if(command == "Panel1")
    {
        changePanel(panel1);
    }
    if(command =="Panel2")
    {
        changePanel(panel2);
    }

   }

 }

private void initMenu() {

JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("Menu");
JMenuItem menuItem1 = new JMenuItem("Panel1");
JMenuItem menuItem2 = new JMenuItem("Panel2");
menubar.add(menu);
menu.add(menuItem1);
menu.add(menuItem2);
this.setMenuBar(menubar);
menuItem1.addActionListener(new MenuAction(panel1));
menuItem2.addActionListener(new MenuAction(panel2));

}

private void changePanel(JPanel panel) {
container.removeAll();
setComponent(panel);
panel.setVisible(true);
container.doLayout(); 
  }
}

ここで SearchPanelClass と AddMaterialPanel は、メニュー項目のクリックに応じて追加したい 2 つのカスタム パネルです。ただし、パネルはウィンドウのサイズ変更時にのみ表示されます。ウィンドウのサイズ変更時にバックエンドで呼び出されるプロシージャを誰か教えてもらえますか?

舵をとってください...

前もって感謝します..

4

1 に答える 1

7

JPanels が追加または削除されているコンテナーでrevalidate()andを呼び出すことを忘れないでください。repaint()

  • revalidate()保持しているすべてのコンポーネントをレイアウトマネージャーに再レイアウトさせるようにコンテナーに指示します。
  • repaint()コンポーネントにそれ自体とそのすべての子を再描画するように指示します。これは常に必要というわけではありませんが、多くの場合、特にコンポーネントが削除された場合に必要になります。

また、==ここで行うように文字列を比較するために使用しないでください。

public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();
    if(command == "Panel1")
    {
        changePanel(panel1);
    }
    if(command =="Panel2")
    {
        changePanel(panel2);
    }

   }

 }

オペレーターは、==2 つの String オブジェクトが同一であるかどうかをチェックしますが、気にする必要はありません。代わりに、2 つの String に同じ文字が同じ順序で含まれているかどうかをテストするString メソッドequals(...)またはを使用します。equalsIgnoreCase(...)たとえば、次のようにします。

String command = e.getActionCommand();
if("Panel1".equalsIgnoreCase(command)) {
    changePanel(panel1);
} else if("Panel2".equalsIgnoreCase(command)) {
    changePanel(panel2);
}

編集:さらに良いことに、CardLayout を使用して JComponents を交換します: CardLayout チュートリアルCardLayout API

編集 2:org.jdesktop.application.SingleFrameApplicationを使用するということは、JSR 296: Swing Application Framework ライブラリを使用していることを意味することに注意してください。そのため、このライブラリが現在サポートまたは更新されているようには見えません。

于 2012-09-02T14:32:22.573 に答える