2

私はJavaにかなり慣れていないので、windowbuilderプログラムを作成しています。Jtabbedpane を使用してプログラム ウィンドウのタブを切り替えるときに、actionlistener を使用して別のクラスからコンテンツを取得できるかどうか疑問に思っています。たとえば、2 つのタブと 2 つのクラスを持つプログラムがあるとします。最初のタブには 1 つのクラスのコードが含まれ、2 番目のタブには 2 番目のクラスのコードが含まれます。

ありがとう

4

2 に答える 2

9

GUIを作成するコードを複数のクラスに分離する場合は、次のアプローチを使用できます。

これは、以下を含むメインクラスになりますJTabbedPane

import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class Main {
    JFrame frame = new JFrame();
    JTabbedPane tabbedPane = new JTabbedPane();
    FirstPanel fp = new FirstPanel();
    SecondPanel sp = new SecondPanel();

    public Main() {
        tabbedPane.add("First", fp);
        tabbedPane.add("Second", sp);
        frame.getContentPane().add(tabbedPane);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(640, 480);
        // frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Main();
            }
        });
    }

}

これは、拡張する2番目のクラス、JPanelまたは他のタイプのコンテナーになります。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JPanel;

public class FirstPanel extends JPanel{

    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.setFont(new Font("Verdana",Font.BOLD,16));
        g.drawString("Hello there", 20, 20);
    }
}

これも拡張する3番目のクラスの例JPanel

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class SecondPanel extends JPanel{
    JButton button = new JButton("Click me!");

    public SecondPanel() {
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null, "You just clicked button");
            }
        });
        add(button);
    }

    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.setFont(new Font("Verdana",Font.BOLD,16));
        g.drawString("Hello there again!", 20, 20);
    }
}

スクリーンショット:

ここに画像の説明を入力してください

編集:

また、でクラスを拡張する代わりに、JPanelカスタマイズされたを返すそのクラスのメソッドだけを作成するのが賢明JPanelです。このようにして、クラスは継承のために「開かれた」ままになります。

于 2012-11-27T00:45:45.567 に答える
3

あなたは次のように述べています:

Jtabbedpane を使用してプログラム ウィンドウのタブを切り替えるときに、actionlistener を使用して別のクラスからコンテンツを取得できるかどうか疑問に思っています。

選択したタブの変更をリッスンする必要がある場合、ActionListener は機能しません。これは、AbstractButton クラスの子によってのみアクティブ化されるためです。代わりに、JTabbedPane はそのモデルとして SingleSelectionModel を使用し、ChangeListener を使用してこれに対する変更をリッスンできることに注意してください。API とチュートリアルは、詳細を記入するのに役立ちます。

一方、タブに保持されている 1 つのコンポーネント内で JButton/ActionListener を使用し、アクションによって別のタブに保持されている別のコンポーネントを変更できるかどうか疑問に思っている場合は、2 つのビューがさまざまなクラスによって作成されます。ここで、オブザーバーまたはリスナーの設計パターンが前面に出てきます。これに関する詳細については、特定の問題の詳細を提供してください。

また、私はbrano88に強く同意します.Swingライブラリの基本にかなり慣れ、実際に十分に基礎を固めるまで、ウィンドウビルダープログラムを使用しないでください.

于 2012-11-27T00:33:52.800 に答える