2016-06-20 6 views
0

を変更する前に、私は新しいタブの選択範囲での変更が有効になる前に、ちょうどすぐに瞬間をキャプチャして、アクションを実行したいと思います。これは、スイングコンポーネントのフォーカスを失ったイベントに類似したものです。目的は、タブが変更されたときにいくつかのJTextFieldのテキストを外部ファイルに保存することです。ユーザーが別のタブをクリックするたびに、現在のタブの値が外部ファイルに書き込まれます。のJavaのJTabbedPane - アクションはすぐにJTabbedPaneのを使用して、選択したタブ

私は、タブの変更を追跡するためにChangeListenerを使用してきたが、私は必要なものを行うための方法を発見していません。どのように次の簡単な例でそれを達成するための任意のアイデアですか?

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTabbedPane; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TabSample { 
    static void add(JTabbedPane tabbedPane, String label) { 
     JButton button = new JButton(label); 
     tabbedPane.addTab(label, button); 
    } 

    public static void main(String args[]) { 
     JFrame frame = new JFrame("TabSample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTabbedPane tabbedPane = new JTabbedPane(); 

     String titles[] = { "Geometry", "Materials", "Analysis"}; 
     for (int i = 0, n = titles.length; i < n; i++) { 
      add(tabbedPane, titles[i]); 
     } 

     ChangeListener changeListener = new ChangeListener() { 
      public void stateChanged(ChangeEvent changeEvent) { 
       JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource(); 
       int index = sourceTabbedPane.getSelectedIndex(); 
       System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index)); 
     } 
     }; 
     tabbedPane.addChangeListener(changeListener); 
     frame.add(tabbedPane, BorderLayout.CENTER); 
     frame.setSize(400, 150); 
     frame.setVisible(true); 
    } 
} 

答えて

4

一つ可能道、と私は(SingleSelectionModel APIをチェックし、SingleSelectionModelのを実装したモデル、これが行うことが許容されるかどうかが、JTabbedPaneのための独自のモデルを作成することであることを100%確実ではありませんよ)、これはsetSelectedIndex(int index)メソッドをオーバーライドしています。このメソッドは、JTabbedPaneにタブを変更するように伝えたいときにSwingが使用することをかなり確信しています。あなたがDefaultSingleSelectionModel、上記のインターフェイスを実装し、このメソッドをオーバーライドする具象クラスから継承するクラスを作成する場合は、スーパーのメソッドが呼び出される前に、メソッド呼び出しを行うため、GUIは前のタブの変更を呼び出して作ることができます。たとえば、あなたのsetSelectedIndex方法は次のようになります。

@Override 
    public void setSelectedIndex(int index) { 
     if (activated) { 
      String text = String.format("Before change, old index: %d; new index: %d", super.getSelectedIndex(), index); 
      JOptionPane.showMessageDialog(gui, text); 
     } 
     super.setSelectedIndex(index); 
    } 

そして、上記のコードを使用しては次のように実装することができます。

import java.awt.BorderLayout; 
import java.awt.Component; 

import javax.swing.DefaultSingleSelectionModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTabbedPane; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TabSample { 
    static void add(JTabbedPane tabbedPane, String label) { 
     JButton button = new JButton(label); 
     tabbedPane.addTab(label, button); 
    } 

    public static void main(String args[]) { 
     JFrame frame = new JFrame("TabSample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     MySingleSelectionModel selectionModel = new MySingleSelectionModel(frame); 

     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.setModel(selectionModel); 

     String titles[] = { "Geometry", "Materials", "Analysis"}; 
     for (int i = 0, n = titles.length; i < n; i++) { 
      add(tabbedPane, titles[i]); 
     } 

     ChangeListener changeListener = new ChangeListener() { 
      public void stateChanged(ChangeEvent changeEvent) { 
       JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource(); 
       int index = sourceTabbedPane.getSelectedIndex(); 
       System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index)); 
     } 
     }; 
     tabbedPane.addChangeListener(changeListener); 
     frame.add(tabbedPane, BorderLayout.CENTER); 
     frame.setSize(400, 150); 
     frame.setVisible(true); 
     selectionModel.setActivated(true); 
    } 

    private static class MySingleSelectionModel extends DefaultSingleSelectionModel { 
     private Component gui; 
     private boolean activated = false; 

     public MySingleSelectionModel(Component gui) { 
      this.gui = gui; 
     } 

     public void setActivated(boolean activated) { 
      this.activated = activated; 
     } 

     @Override 
     public void setSelectedIndex(int index) { 
      if (activated) { 
       String text = String.format("Before change, old index: %d; new index: %d", 
         super.getSelectedIndex(), index); 
       JOptionPane.showMessageDialog(gui, text); 
      } 
      super.setSelectedIndex(index); 
     } 
    } 
} 

私は行動変容を有効にするブールフィールド、activatedを使用するノートGUIの作成時に起動しないこと。のGUIを表示した後に、モデルsetActivated(true)に電話します。あなたの編集について


目的は、タブが変更されたときに、外部ファイルにいくつかのJTextFieldのテキストを保存するので、毎回ユーザーが別のタブの値をクリックします現在のタブが外部ファイルに書き込まれます。

私はそれはあなたが最善の解決策は完全に異なるアプローチを使用するときに特定のコードの問題を解決する方法を尋ね、すべての後にXY Problem、だった、知られている必要があります。将来的には、元の質問に関連するすべての情報を提供して、不要な解決策で時間を無駄にしないようにしてください。

データタブの変更を得るために完全に罰金ですので、タブの変更の前には何もを行うためにここに必要は実際にはありません。あなたの解決策は、ChangeListenerを使用することです。上に投稿したものの体操を行う必要はありません。

+0

私はあなたがそれを説明することができ、アクションを実行することができる方法を得ることはありませんか?たぶん、質問が十分ではなかった、私はそれを編集しました。 – David

+0

@David:上記の私の編集をご覧ください。私たちはボランティアであり、提供されたヘルプは私どもの時間に行われていることを理解してください。 –

+0

ご迷惑をおかけして申し訳ありません。私は、助けたい人のために簡単にできるように、できるだけ多くの質問を簡素化したいと思っていました。それでも、私はChangeListenerを使ってそれを行う方法はわかりません。 – David

関連する問題