2013-12-17 100 views
4

對不起,如果這是你的另一個愚蠢的愚蠢問題,但我仍然是Java編程語言的新手。如何更改或分配值給另一個類的專用變量JTextField?

我有3類:InputClass,PreviewClassMainClass

MainClass包含main method來運行程序。 InputClass包含用於輸入的private JTextField和用於在PreviewClass中將文本設置爲JTextFieldJButtonPreviewClass包含專用JTextField以顯示InputClass中的輸入文字。

我究竟該怎麼做(分配在PreviewClass價值JTextField沒有創建實例InputClass,然後使用getter-method-like獲得它的價值,或者,InputClass使JTextField一個static變量,所以我可以訪問它與一些static method

只是爲了顯示你我的觀點,這裏是代碼:

  1. InputClass

    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.*; 
    
    public class InputClass extends JPanel implements ActionListener{ 
    
        private JTextField inputName; 
        private JButton inputButton; 
    
        public InputClass() { 
         setLayout(new FlowLayout()); 
    
         inputName=new JTextField(15); 
         inputButton=new JButton("INPUT"); 
         inputButton.addActionListener(this); 
    
         add(inputName); 
         add(inputButton); 
        } 
    
        @Override 
        public void actionPerformed(ActionEvent event) { 
         // How do I change/assign a text to the PreviewClass from here? 
        } 
    
    } 
    
  2. PreviewClass

    import javax.swing.*; 
    import java.awt.*; 
    
    public class PreviewClass extends JPanel{ 
        private JTextField namePreview; 
    
        public PreviewClass() { 
          setLayout(new FlowLayout()); 
    
          namePreview=new JTextField(15); 
          namePreview.setEditable(false); 
    
          add(namePreview); 
        } 
    
    } 
    
  3. MainClass

    import javax.swing.*; 
    import java.awt.*; 
    
    public class MainClass extends JFrame{ 
        private static final int FRAME_WIDTH=250; 
        private static final int FRAME_HEIGHT=150; 
        private static final int FRAME_X_ORIGIN=400; 
        private static final int FRAME_Y_ORIGIN=300; 
    
        private InputClass inputPanel; 
        private PreviewClass previewPanel; 
    
        private JTabbedPane tabbedPane; 
        private Container contentPane; 
    
        public MainClass() { 
         contentPane=getContentPane(); 
         contentPane.setLayout(new BorderLayout()); 
    
         setTitle("How to Assign Value from Another Class"); 
         setSize(FRAME_WIDTH, FRAME_HEIGHT); 
         setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN); 
    
         inputPanel=new InputClass(); 
         previewPanel=new PreviewClass(); 
    
         tabbedPane=new JTabbedPane(); 
         tabbedPane.add("Input Name", inputPanel); 
         tabbedPane.add("Preview Name", previewPanel); 
    
         contentPane.add(tabbedPane, BorderLayout.CENTER); 
    
         setDefaultCloseOperation(EXIT_ON_CLOSE); 
        } 
    
        public static void main(String[] args) { 
         MainClass frame=new MainClass(); 
         frame.setVisible(true); 
        } 
    } 
    
+0

你想在InputClass獲得 「inputName」 的值,並賦值爲 「namePreview」 在PreviewClass? – AJJ

+0

你是什麼意思,而不創建一個InputClass的實例,然後使用getter-method-like來獲得它的值呢?在MainClass中實例化時重寫'actionPerformed'怎麼辦? – ssssteffff

回答

0

你是對的,以避免使其成爲靜態 - 這將是一個壞主意。

這裏的解決方案是當您創建輸入類時,將對您的預覽類的引用傳遞到您的輸入類。

引用和然後輸入類存儲可以做preview.inputRecieved(str)當文本字段改變

創建inputRecieved方法然後可以更新JLabel和/或做任何其它處理是必要的。

請注意,這也意味着您可以更改預覽窗口的顯示方式和組織方式,而無需更改輸入窗口。那encapsulation是一個重要的面向對象的設計原則。

0

將previewClass的引用傳遞給Inputclass的構造函數以設置所需的值。

InputClass

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

public class InputClass extends JPanel implements ActionListener{ 

    private JTextField inputName; 
    private JButton inputButton; 

    public InputClass(final PreviewClass perviewClassObj) { 
     setLayout(new FlowLayout()); 

     inputName=new JTextField(15); 
     inputButton=new JButton("INPUT"); 
     inputButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       perviewClassObj.setNamePreview(inputName.getText()); 
      } 
     }); 

     add(inputName); 
     add(inputButton); 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     // How do I change/assign a text to the PreviewClass from here? 
    } 

} 

PreviewClass

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

public class PreviewClass extends JPanel{ 
    private JTextField namePreview; 

    /** 
    * @param namePreview the namePreview to set 
    */ 
    public void setNamePreview(String textContent) { 
     this.namePreview.setText(textContent); 
    } 

    public PreviewClass() { 
     setLayout(new FlowLayout()); 

     namePreview=new JTextField(15); 
     namePreview.setEditable(false); 

     add(namePreview); 
    } 

} 

MainClass

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

public class MainClass extends JFrame{ 
    private static final int FRAME_WIDTH=250; 
    private static final int FRAME_HEIGHT=150; 
    private static final int FRAME_X_ORIGIN=400; 
    private static final int FRAME_Y_ORIGIN=300; 

    private InputClass inputPanel; 
    private PreviewClass previewPanel; 

    private JTabbedPane tabbedPane; 
    private Container contentPane; 

    public MainClass() { 
     contentPane=getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     setTitle("How to Assign Value from Another Class"); 
     setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN); 

     previewPanel=new PreviewClass(); 
     inputPanel=new InputClass(previewPanel); 

     tabbedPane=new JTabbedPane(); 
     tabbedPane.add("Input Name", inputPanel); 
     tabbedPane.add("Preview Name", previewPanel); 

     contentPane.add(tabbedPane, BorderLayout.CENTER); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     MainClass frame=new MainClass(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+0

這是個人的事情,但將'PreviewClass'的引用傳遞給'InputClass'不必要地將'PreviewClass'暴露給'InputClass',從而使它有機會進行超出其全局責任的更改。 – MadProgrammer

+0

是的..我也同意。傳遞參考不是好事。但爲了他的設計工作,我認爲這可能是關於這種方法。相反,他可以使用靜態變量。 – AJJ

+0

是啊,我只是偏執狂... – MadProgrammer

0

在InputClass,ACC ESS父的JFrame,並得到它的預覽對象,並設置該字符串值:

@Override 
public void actionPerformed(ActionEvent event) { 
    // How do I change/assign a text to the PreviewClass from here? 
    ((MainClass)SwingUtilities.getWindowAncestor(this)).getPreviewPanel().setValue(inputName.getText()); 
} 

在PreviewClass(暴露setter方法改變文本):

public void setValue(String s){ 
    namePreview.setText(s); 
} 

在MainClass(暴露的getter方法訪問預覽面板對象):

public PreviewClass getPreviewPanel(){ 
    return previewPanel; 
} 
2

您有任何數量的可能的解決方案,所有的優點和缺點。

如果我面臨這樣一個問題,我會很想創建一個interface這將描述什麼可以改變,以及如何,甚至提供事件通知時的interface變化的內部狀態。

然後,我會創建一個這個interface的實例,並將其傳遞給每個類。那些需要它的值的類將從它讀取它們需要的值,並且如果可用,附加某種變化/屬性監聽器,以便它們可以監視對interface的更改。

那些需要對interface進行更改的類將根據需要進行更改。

更改後,interface將觸發更新,讓任何正在偵聽的人知道已做出更改。

通過這種方式,可以將每個類與類分離並減少其他類的不必要的曝光。

這是「示範」的MVC模式,並介紹了observer pattern

0

您可以設置InputClassabstract類,覆蓋在實例化時actionPerformed方法,在你PreviewClass創建一個二傳手:

PreviewClass

public class PreviewClass extends JPanel{ 

    ... 

    public void setNamePreview(String name) { 
     inputName.setText(name); 
    } 
} 

InputClass

public abstract class InputClass extends JPanel implements ActionListener{ 

    private JTextField inputName; 
    private JButton inputButton; 

    public InputClass() { 
     setLayout(new FlowLayout()); 

     inputName=new JTextField(15); 
     inputButton=new JButton("INPUT"); 
     inputButton.addActionListener(this); 

     add(inputName); 
     add(inputButton); 
    } 

    public String getInputNameValue(){ 
     return inputName.getText(); 
    } 
} 

MainClass

... 

    previewPanel=new PreviewClass(); 
    inputPanel=new InputClass() { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      previewPanel.setNamePreview(inputPanel.getInputNameValue()); 
     } 
    }; 

    ... 
相關問題