1

アプリケーションプロパティを設定すると思われるプログラムを作成しました。JScrollPane で JSplit ペインを使用しています。プログラムは正常にロードされていますが、左側のリスト要素に応じて右側のパネルの値が変更されていません。私が何か間違ったことをしている場合はお知らせください。以下のプログラムを参考にしました

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ApplicationPropertyDlg extends JDialog implements ActionListener,ListSelectionListener {

   private DButton     pb_OK           = null ;
   private DButton     pb_CANCEL       = null ;
   private DButton     pb_APPLY        = null ;
   private String[]         appProp     = null;
   private JList            appList     = null;
   private JSplitPane       appPanel    = null;
   private JScrollPane      listScrollPanel,appScrollPanel  = null; 

   public ApplicationPropertyDlg ( AppDefaultWin parent ) {
      super ( parent, "Properties Application", true ) ;
      initializeAppProp();
      intializeAppList();
      initializeGUI();
      ButtonPanel buttonPanel = new ButtonPanel () ;
      setSize ( 800,700 ) ;
      WinUtil.centerChildInParent ( this, parent ) ;          
      pb_OK     = new JButton ( ) ;
      pb_APPLY  = new JButton ( ) ;
      pb_CANCEL = new JButton ( ) ;

      pb_OK.addActionListener ( this ) ;
      pb_APPLY.addActionListener ( this ) ;
      pb_CANCEL.addActionListener ( this ) ;
      GUISystem.setPreferredButton ( pb_OK ) ;
      GUISystem.setPreferredButton ( pb_CANCEL ) ;
      GUISystem.setPreferredButton ( pb_APPLY ) ;
      getContentPane().setLayout ( new BorderLayout (5,5) ) ;
      getContentPane().add(appPanel);
      getContentPane().add ( buttonPanel, BorderLayout.SOUTH ) ;
      buttonPanel.add ( pb_OK ) ;
      buttonPanel.add ( pb_APPLY ) ;
      buttonPanel.add ( pb_CANCEL ) ;                                 
      setVisible ( true ) ;   
   }

   private void initializeGUI() {
    // TODO Auto-generated method stub
       listScrollPanel = new JScrollPane(appList);
       appScrollPanel = new JScrollPane(new GeneralPage());
       appPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,listScrollPanel,appScrollPanel);
       appPanel.setOneTouchExpandable(true);
       appPanel.setDividerLocation(200);
       //minimum size for individual Panel
       Dimension minimumSize = new Dimension(100, 50);
       listScrollPanel.setMinimumSize(minimumSize);
       appScrollPanel.setMinimumSize(minimumSize);
       //Provide a preferred size for the split pane.
       appPanel.setPreferredSize(appPanel.getPreferredSize());     

}


private void intializeAppList() {
    // TODO Auto-generated method stub
       appList = new JList(appProp);
       appList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
       appList.setSelectedIndex(0);
       appList.addListSelectionListener(this);


}





private void initializeAppProp() {
    // TODO Auto-generated method stub
    appProp = new String []{"General","Task Bar", "Look and Feel","Country"};
}

   public void propertyChanged ( int property, Object value ) {
      if ( property == PropertySystem.PROPERTY_LANGUAGE )
         setText() ;
      else if ( property == PropertySystem.PROPERTY_LAF )
         GUISystem.setLookAndFeel ( this ) ;
      else
         GUISystem.setPropertiesOnPanel ( getContentPane() ) ;
   }




   public void actionPerformed ( ActionEvent e ) {
         dispose() ;
   }



@Override
public void valueChanged(ListSelectionEvent e) {
    // TODO Auto-generated method stub
    JList list = (JList)e.getSource();
    updateAppPanel(appProp[list.getSelectedIndex()]);

}

private void updateAppPanel(String panelName) {
    // TODO Auto-generated method stub
    if(panelName.equalsIgnoreCase("General"){
        appScrollPanel.removeAll();
        appScrollPanel.add(new GeneralPage());
    }
    else if (panelName.equalsIgnoreCase("Task Bar"){
        appScrollPanel.removeAll();
        appScrollPanel.setViewportView(new TaskBarPage());
    }
    else if (panelName.equalsIgnoreCase("Language"){
        appScrollPanel.removeAll();
        appScrollPanel.setViewportView(new LanguagePage());
    }
    else if (panelName.equalsIgnoreCase("Look and Feel"){
        appScrollPanel.removeAll();
        appScrollPanel.setViewportView(new LookFeelPage());
    }
    else if (panelName.equalsIgnoreCase("Country"){
        appScrollPanel.removeAll();
        appScrollPanel.setViewportView(new SelectCountryPage());
    }
    appScrollPanel.revalidate();
    appScrollPanel.repaint();   
    }
} 
4

1 に答える 1

3

最初に、新しいコントロール コンテナーをクラスに追加します (できれば a JPanel)。

    ...
    private JSplitPane       appPanel    = null;
    private JScrollPane      listScrollPanel,appScrollPanel  = null;
    // End of your controls...

    private JPanel tabContainer;   

appScrollPanel次に、コードが変数を初期化するコード セクションで、 a の新しいインスタンスを渡す代わりに、次GeneralPanetabContainerように を渡します。

     tabContainer = new JPanel();
     tabContainer.setLayout(new CardLayout());
     tabContainer.add(new GeneralPage());
     // Instead of adding GeneralPane directly, add the GeneralPane container
     appScrollPanel = new JScrollPane(tabContainer);

次に、updateAppPanelメソッドで、呼び出しを次のように置き換えappScrollPanel.setViewportViewます。

private void updateAppPanel(String panelName) {
    // TODO Auto-generated method stub
    if(panelName.equalsIgnoreCase("General")){
        tabContainer.removeAll();
        tabContainer.add(new GeneralPage());
    } 
    else if (panelName.equalsIgnoreCase("Task Bar")){
        tabContainer.removeAll();
        tabContainer.add(new TaskBarPage());
    }
    else if (panelName.equalsIgnoreCase("Language")){
        tabContainer.removeAll();
        tabContainer.add(new LanguagePage());
    }
    else if (panelName.equalsIgnoreCase("Look and Feel")){
        tabContainer.removeAll();
        tabContainer.add(new LookFeelPage());
    } 
    else if (panelName.equalsIgnoreCase("Country")){
        tabContainer.removeAll();
        tabContainer.add(new CountryPage());
    }
    appScrollPanel.revalidate();
    appScrollPanel.repaint();   
}

そしてそれはうまくいくはずです:

ここに画像の説明を入力

ここに画像の説明を入力

updateAppPanelコードをループ内に入れることをお勧めしますか? else ifすべてのブロックの内部本体に変更を加える必要がある場合は、いくつかの手間を省くことができます

于 2012-11-07T04:18:06.120 に答える