2016-03-21 11 views
-2

問題があって解決策が見つかりましたが、この次のコードが機能しない理由を理解できません。 私がしたいのは、 "Administration.class"でボタンが押されたときにタブが切り替わるということです。 "Main.class"に追加されたJTabbedPaneを取得しました。これはプライベート変数として宣言されています。その後、アクションリスナーから親パネルのメソッドを呼び出す方法

private JTabbedPane JPT; 

私はタブを変更しなければならない簡単な方法を、持っている、ときに呼び出さ:

public void SetPane() { 
    JTP.setSelectedIndex(2); 
} 

は、その後、私はAdministration.classでMain.classのオブジェクトを作成し、このメソッドを呼び出しています、ボタンを押したとき:

btnRework.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Main m = new Main(); 
      m.SetPane(); 
     } 
    }); 

これは機能しません。何も起こりません、ボタンがクリックされると、私はエラーではありません。

これは動作します: Main.class

public static JTabbedPane JTP; 

Administration.class

btnRework.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Main.JTP.setSelectedIndex(2); 
     } 
    }); 

を例が最初に動作していない、そして多分あなたたちは私がに見ている可能性のリンクを、持っている理由この問題を記述しているコンテンツ変数とそのメソッドを扱いたいだけなら、もっと良い方法は何ですか? ありがとうございます!

Main.class:

public class Main extends JDialog { 

private static final long serialVersionUID = 1L; 

private Home home = new Home(); 
private Insertation insertation = new Insertation(); 
private Edit edit = new Edit(); 
private Administration administration = new Administration(); 
private Addition addition = new Addition(); 
public static JTabbedPane JTP; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    try { 
     Main dialog = new Main(); 
     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     dialog.setVisible(true); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Create the dialog. 
*/ 
public Main() { 
    super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL); 
    setResizable(false); 
    setSize(1030, 720); 
    getContentPane().setLayout(new BorderLayout()); 
    setTitle("Ebay Manager"); 

    JTP = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); 
    JTP.addTab("Home", home); 
    JTP.addTab("Inserat", insertation); 
    JTP.addTab("Bearbeitung", edit); 
    JTP.addTab("Verwaltung", administration); 
    JTP.addTab("Zusatz", addition); 
    getContentPane().add(JTP); 
} 

}

Administration.class:

public class Administration extends JPanel { 

private static final long serialVersionUID = 1L; 
private JButton btnRework; 
private Main main; 

/** 
* Create the panel. 
*/ 
public Administration() { 
    setLayout(null); 
    setSize(1000, 650); 
    setDoubleBuffered(true); 

    btnRework = new JButton("Bearbeiten"); 
    btnRework.setBounds(42, 571, 116, 32); 
    add(btnRework); 
    btnRework.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      main.SetPane(); 
     } 
    }); 
} 

}ここで

+0

基本的に、静的フィールドと非静的フィールドの違いについては、静的なものはクラスのすべてのオブジェクトで同じですが、非静的なフィールドはオブジェクトごとに異なる場合があります。一般的には、静的フィールドを避ける必要があります。 – GhostCat

+0

定数を除きます。 – Majora320

答えて

0
Main m = new Main(); 
m.SetPane(); 

は、あなたがMainが、あなたのインスタンスを作成していますないどこにでも追加できます。

編集:

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

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 

public class Administrator extends JFrame { 
    private Main main; 
    public Administrator() { 
     main = new Main(); 

     add(main); 

     JButton button = new JButton("Set"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       main.setPane(); 
      } 
     }); 

     add(button, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     Administrator adminFrame = new Administrator(); 
     adminFrame.setSize(400, 400); 
     adminFrame.setVisible(true); 

    } 
} 

class Main extends JPanel { 
    private JTabbedPane jtp; 

    public Main() { 
     super(new BorderLayout()); 
     jtp = new JTabbedPane(); 

     jtp.add("tab1", new JLabel("Content1")); 
     jtp.add("tab2", new JLabel("Content2")); 

     add(jtp); 
    } 

    public void setPane() { 
     jtp.setSelectedIndex(1); 
    } 
} 
+0

私はSetPane()メソッドを呼び出すことができるように、これを行いました。プログラミングスタイルが悪いですか? –

+0

問題はあなたが 'setPane()'を呼び出すのではなく、 'setPane()' _on_を呼び出すオブジェクトです。 –

+0

サンプルコードを追加しました。良いレイアウトではありませんが、あなたが望むように働いています。これをチェックしてください。 – rdonuk

0

あなたが作成し、あなたのアクションリスナーの内側に捨て、新たな未延伸フレーム内のペインを切り替えています。アプリケーションにパックされ描画された(おそらく)フレームの枠を切り替える必要があります。

ので、代わりの

Main m = new Main(); 
m.SetPane(); 

あなたは正確にあなたがどのように作成するか

myMainFrame.SetPane(); 

を必要とmyMainFrameを覚えているが(あなたがあなたの質問に多くのコードを追加しない限り)この回答の範囲を超えています。

+0

ありがとう、より多くのコードが追加されました(Main.class)。 –

+0

アクションリスナは、メインフレームまたはJTPタブペインのボタンにありますか? 'Main'が' JFrame'であると仮定すると、 '((Main)((JTabbedPane)e.getSource())。getParent())。 –

0

私はrdonukの答えのために私自身の解決策を見つけました。私はメインの別のインスタンスを作ることができないので。class Main.classの作成時に、Administration.class内でJTabbedPaneを変数として設定します。ちょうど簡単なセッターメソッド。すべての回答ありがとう!

関連する問題