2011-08-13 14 views
8

JPanelを含むJava JFrameがあります。そのJPanelには2つの別個のJPanelがあります。ユーザーが最初のJPanelのボタンをクリックすると、クリックされたボタンを通知するメッセージを他のJPanelに送信する必要があります。このようなオブジェクト間でメッセージを送信する最も簡単な方法は何ですか?2つのJPanelオブジェクト間でメッセージを送信する

答えて

11

:私は推薦しています何
は1 JPanelのは、他のJPanelの知識を持たないし、すべての接続を介して行われていることをことを、疎結合でありますある種の制御。例えば、あなたのコードの一部借りします

CopyTextNorthPanel2.javaを

import java.awt.*; 
import javax.swing.*; 

public class CopyTextNorthPanel2 extends JPanel { 

    private static final long serialVersionUID = 1L; 
    public JTextField northField; 

    public CopyTextNorthPanel2() { 
     northField = new JTextField("Welcome World"); 
     northField.setFont(new Font("Serif", Font.BOLD, 20)); 
     northField.setPreferredSize(new Dimension(300, 25)); 
     add(northField); 
    } 

    public String getNorthFieldText() { 
     return northField.getText(); 
    } 
} 

CopyTextSouthPanel2.java

import java.awt.event.*; 
import javax.swing.*; 

public class CopyTextSouthPanel2 extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private JTextField firstText = new JTextField("Desired TextField"); 
    private JButton copyButton = new JButton("Copy text from JTextFields"); 
    private CopyTextControl2 control; 

    public CopyTextSouthPanel2() { 
     copyButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (control != null) { 
       control.copyAction(); 
      } 
     } 
     }); 

     add(firstText); 
     add(copyButton); 
    } 

    public void setControl(CopyTextControl2 control) { 
     this.control = control; 
    } 

    public void setFirstText(String text) { 
     firstText.setText(text); 
    } 
} 

CopyTextControl2.java

public class CopyTextControl2 { 
    private CopyTextNorthPanel2 northPanel; 
    private CopyTextSouthPanel2 southPanel; 

    public void copyAction() { 
     if (northPanel != null && southPanel != null) { 
     southPanel.setFirstText(northPanel.getNorthFieldText()); 
     } 
    } 

    public void setNorthPanel(CopyTextNorthPanel2 northPanel) { 
     this.northPanel = northPanel; 
    } 

    public void setSouthPanel(CopyTextSouthPanel2 southPanel) { 
     this.southPanel = southPanel; 
    } 

} 

CopyText2.java

import java.awt.*; 
import javax.swing.*; 

public class CopyText2 { 

    private static void createAndShowUI() { 
     CopyTextNorthPanel2 northPanel = new CopyTextNorthPanel2(); 
     CopyTextSouthPanel2 southPanel = new CopyTextSouthPanel2(); 
     CopyTextControl2 control = new CopyTextControl2(); 

     southPanel.setControl(control); 
     control.setNorthPanel(northPanel); 
     control.setSouthPanel(southPanel); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     mainPanel.add(northPanel, BorderLayout.NORTH); 
     mainPanel.add(Box.createRigidArea(new Dimension(100, 100)), BorderLayout.CENTER); 
     mainPanel.add(southPanel, BorderLayout.SOUTH); 

     JFrame frame = new JFrame("Copy Text"); 
     frame.getContentPane().add(mainPanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

ありがとう、バッテリーが含まれていない、私は私のタイムゾーンで同じことを見ることができます深夜2時間以上過ぎて、眠る時間+1 – mKorbel

+0

@ mKorbel:良い夜と良い残り! –

+0

レッスンありがとうございました。複数の接続がある場合はagreen、その後はより良いです... – mKorbel

6

カスタムイベントを作成し、1つまたは複数のリスナーをアタッチすることができます。

実装する適切な方法は、Button ActionListenerにイベントを発生させ、次に2つのパネルをそのイベントのリスナーにすることです。あなたのクラスのトップ

public MyClass implements ActionListener { 

... 
myButton.addActionListener(this); 
... 

public void actionPerformed(ActionEvent e) { 
     //for example if you have more than one events that you need to handle 
     if(e.getSource().equals(myButton) { 
      //update your do some work on you jpanels 
     } 
} 

+1

['EventListenerList'](http://download.oracle.com/javase/7/docs/api/javax/swing/event/EventListenerList.html)も参照してください。 – trashgod

+0

リンク(http://www.exampledepot.com/egs/java.util/custevent.html)は廃止されているようです – Lucio

3

しかし、実際に、私はデザインパターンについて考え始めるための時間だと思います。あなたが記述していることはobserverパターンのための完璧な候補であると、おそらくコンストラクタを使用して、例えばcommandパターン

2

は(問題をデバッグのための)クラスまたはをビトウィーンズgetParent()

import java.awt.*; 
import javax.swing.*; 

public class CopyTextFrame extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private CopyTextNorthPanel northPanel; 
    private CopyTextCenterPanel centerPanel; 
    private CopyTextSouthPanel southPanel; 

    public void makeUI() { 
     northPanel = new CopyTextNorthPanel(); 
     centerPanel = new CopyTextCenterPanel(); 
     southPanel = new CopyTextSouthPanel(); 
     northPanel.setName("northPanel"); 
     centerPanel.setName("centerPanel"); 
     southPanel.setName("southPanel"); 
     centerPanel = new CopyTextCenterPanel(); 
     centerPanel.setPreferredSize(new Dimension(300, 40)); 
     southPanel = new CopyTextSouthPanel(); 
     southPanel.setSourceTextField(northPanel.desText); 
     northPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); 
     centerPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); 
     southPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); 
     setLayout(new BorderLayout(5, 5)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     add(northPanel, BorderLayout.NORTH); 
     add(centerPanel, BorderLayout.CENTER); 
     add(southPanel, BorderLayout.SOUTH); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new CopyTextFrame().makeUI(); 
      } 
     }); 
    } 
} 
を使用することによって、所望の JComponent(S)から価値を引き出します

+

import javax.swing.*; 

public class CopyTextCenterPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public CopyTextCenterPanel() { 
    } 
} 

+

import java.awt.*; 
import javax.swing.*; 

public class CopyTextNorthPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    public JTextField desText; 

    public CopyTextNorthPanel() { 
     desText = new JTextField("Welcome World"); 
     desText.setFont(new Font("Serif", Font.BOLD, 20)); 
     desText.setPreferredSize(new Dimension(300, 25)); 
     desText.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); 
     desText.addComponentListener(null); 
     desText.setName("desText"); 
     add(desText); 
    } 

    public JTextField getDesText() { 
     return desText; 
    } 
} 
mKorbel(およびオリジナルポスター)については

+

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class CopyTextSouthPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private JTextField firstText; 
    private JButton copyButton; 
    private JTextField sourceTextField; 
    private String lds = ""; 

    public CopyTextSouthPanel() { 
     firstText = new JTextField("Desired TextField"); 
     firstText.setMinimumSize(new Dimension(300, 25)); 
     firstText.setPreferredSize(new Dimension(300, 25)); 
     firstText.setMaximumSize(new Dimension(300, 25)); 

     copyButton = new JButton("Copy text from JTextFields"); 
     copyButton.setMinimumSize(new Dimension(200, 25)); 
     copyButton.setPreferredSize(new Dimension(200, 25)); 
     copyButton.setMaximumSize(new Dimension(200, 25)); 
     copyButton.addActionListener(new java.awt.event.ActionListener() { 

      @Override 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       copyButtonActionPerformed(evt); 
      } 

      private void copyButtonActionPerformed(ActionEvent evt) { 
       System.out.print("Button pressed" + "\n"); 
       Component[] comp = CopyTextSouthPanel.this.getParent().getComponents(); 
       int nO = comp.length; 
       for (int i = 0; i < comp.length; ++i) { 
        if (comp[i] instanceof JPanel) { 
         String name = ((JPanel) comp[i]).getName(); 
         if (name.equals("northPanel")) { 
          JPanel panel = (JPanel) comp[i]; 
          Component[] comp1 = panel.getComponents(); 
          int nO1 = comp1.length; 
          for (int ii = 0; ii < comp1.length; ++ii) { 
           if (comp1[ii] instanceof JTextField) { 
            String name1 = ((JTextField) comp1[ii]).getName(); 
            if (!(name1 == null)) { 
             if (name1.equals("desText")) { 
              JTextField text = (JTextField) comp1[ii]; 
              String str = text.getText(); 
              firstText.setText(str); 
              System.out.print("set value -> " + str + "\n"); 
              break; 
             } 
            } 
           } 
          } 
          break; 
         } 
        } 
       } 
       lds = sourceTextField.getText(); 
       if (lds != null || (!(lds.isEmpty()))) { 
        firstText.setText(" Msg -> " + lds); 
       } 
      } 
     }); 
     add(firstText, BorderLayout.EAST); 
     add(copyButton, BorderLayout.WEST); 
    } 

    public void setSourceTextField(JTextField source) { 
     this.sourceTextField = source; 
    } 
} 
+0

あなたはきれいに見えるパネルのいずれかへの参照の取得をハードコーディングしています脆弱な溶液。両方のJPanelsを互いに無知にし、他の答えに応じてリスナーを使用する方がずっと良いです。 –

+0

@ Hovercraftあなたのコメントに依存しているあなたのコメントは、賢明なことを言うのは難しいです、コンストラクタ、そして最終的にはGetter/Setterもハードコードされていますが、私はJComponentsの基本的なものと考えられています。オブジェクトのクラス何かが間違っている場合にはすべての接続で起こる – mKorbel

+0

私の答えを参照してください私の意味を理解してください。 –