1

JTabbedPanelJFrameJTree. でリボンを作成するクラスの 1 つが を作成しJTabbedPanelます。JButtonこれには、 を更新する関数が必要JTreeです。

私はいくつかのゲッターを持っていJButtonますが、メインメソッドで作成されたオブジェクト (GUI オブジェクト、どこから にアクセスできるか) で何かを更新するために を使用する方法がわかりませんJTree

の実際のクラスのメイン メソッドで作成されたオブジェクトで何かを更新するにはどうすればよいJButtonですか?

プロジェクトの構造を変更する必要があるかもしれません。

public class Gui extends JFrame{
private Ribbon ribbon;
private Status status;
public Panel panel;

public Gui(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("INIT TITLE");
    setExtendedState(Frame.MAXIMIZED_BOTH);     
    setMinimumSize(new Dimension(600,400));
    setVisible(true);
    try {
          UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception e) {
          e.printStackTrace();
    }

    ribbon = new Ribbon();
    add(ribbon, BorderLayout.NORTH);        
    status = new Status();
    add(status, BorderLayout.SOUTH);
    panel = new Panel();
    add(panel, JSplitPane.HORIZONTAL_SPLIT);
    //panel.setLeftComponent(panel.getTree());
    //panel.openProject();
    setVisible(true);
    panel.loadProject();
}

リボンは多くのことをしません:

public class Ribbon extends JTabbedPane {

public Ribbon(){

    addTab("Home", null, new RibbonHome());
    addTab("Import", null, new RibbonImport());
    addTab("Options", null, new RibbonOptions());
}

}

しかし、Ribbon-Tab はいくつかのボタンを作成します。

public class RibbonHome extends JPanel{
private JButton b1, b2, b3;

public RibbonHome(){
    b1 = new JButton("test1");
    b2 = new JButton("test2");
    b3 = new JButton("test3");
    add(b1);
    add(b2);
    add(b3);

    b1.addActionListener(new ActionListener() {


        @Override
        public void actionPerformed(ActionEvent arg0) {
             //UPDATE the JTree 
        }
    });      

}

}
4

3 に答える 3

1
  1. ボタン。addActionListener (メイン);
  2. main はActionListenerを実装し、メソッドactionPerformed()を提供します
于 2012-11-15T19:11:52.207 に答える
0

もちろん、最も明白な答えは、クラスの参照をGuiクラスに渡すことです。Ribbonこれにより、クラスにそれを渡すことができRibbonHomeます。

public Gui{
  //...
  ribbon = new Ribbon( this );
  //...
}

public Ribbon ( Gui gui ){
  //...
  addTab("Home", null, new RibbonHome( gui ));
  //...
}

public RibbonHome( Gui gui){
  //...
  b1.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
      //UPDATE the JTree 
    }
  }); 
  //...
}

ただし、これにより、異なるクラス間の非常に緊密な結合が保証されます。それについて何を更新したいのか正確にはわかりませんJTreeが、より基本的な解決策は、異なるビュー間でモデルを共有することかもしれません。モデルが変更されると自分JTree自身が更新され、ボタンはモデルを更新するだけです。

于 2012-11-17T10:59:46.747 に答える
0

あなたがやっていることのコードサンプルは物事をより簡単にするでしょうが、とにかく.

おそらく、更新しようとしているコンポーネントをクラス メンバーにしたいでしょう。このようにして、現在初期化されている場所で初期化できますが、ActionListener からアクセスできます。

繰り返しますが、これはあなたがどのように構造化したかについてのちょっとした推測です。そのため、コード サンプルを投稿できれば、より詳細な回答を得ることができると確信しています。

コードサンプルの後に編集:

RibbonHome に、タイプ Gui の追加のプライベート メンバーを与えることができます。私は通常それを親と呼ぶので、次のようになります。private Gui parent;

RibbonHome のコンストラクターで、Gui をパラメーターとして追加します。このようにして、RibbonHome は常にその親にアクセスできます。

リボンのコンストラクターにも追加します。そこを通過したいからです。

最後のステップとして、Gui をパラメーターとして使用して常にリボンを構築する必要があるため、Gui では次のようになります。ribbon = new Ribbon(this);

このすべてを実行するとすぐに、親の JTree の getter によって JTree にアクセスできます。

これには、Gui 以外のコンポーネントから新しいリボンを構築できないという欠点があるため、より良い解決策がありますが、それが必要な場合は、インターフェイスを操作できます。

于 2012-11-15T19:11:42.690 に答える