2017-07-02 12 views
0

私はちょうど私のコンピュータ科学のクラスでGUIについて学び始めました。単純なGUIアプリケーションですが、シンボルの追加が見つかりません

GUIアプリケーションを以下のように設計して、次のタスクを実行します。 1.テキストフィールドはデータファイル名用です。ファイル名の長さは5〜10で、ファイル拡張子は.txtを指定しない場合は、有効なファイル名を入力するようユーザーに求めます。 2.データファイルの内容を読み込んで、テキストエリアに表示します。

これは私のコードは、これまで

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

public class FileLoader implements ActionListener { 


private final LayoutManager layout; 
private JButton loadButton; 
private JTextField filename; 
private JTextArea display; 

public FileLoader() 
{ 

layout = new FlowLayout(); 
    setLayout(layout); 
    JFrame frame = new JFrame(); 
    JPanel buttonPanel = new JPanel(); 

    loadButton = new JButton("Load File"); 
    filename = new JTextField(10); 
    buttonPanel.add(filename); 
    buttonPanel.add(loadButton); 
    display = new JTextArea(25, 50); 

    add(new JLabel("File Name: ")); 
    add(filename); 
    add(new JScrollPane(display)); 
    add(loadButton); 

    loadButton.addActionListener(this); 


} 

public void actionPerformed(ActionEvent event) { 
try{ 

    String file = filename.getText(); 
    int filesize = file.length(); 

if (filesize>= 5 && filesize<= 10){ 
    Scanner input = new Scanner(getClass().getResourceAsStream(file)); 
    String DisTXT = " "; 
    while (input.hasNextLine()){ 
    DisTXT = DisTXT + input.nextLine(); 
    if (input.hasNextLine()){ 
     DisTXT = DisTXT + "\n"; 
} 
} 
display.setText(DisTXT); 
input.close(); 
} 


else 
{ 
if (filesize< 5){ 
display.setText("File NAME ERROR: NAME IS TOO SHORT"); 
} 
else { 
display.setText("File NAME ERROR: NAME IS TOO LONG"); 
} 

} 
} 
catch (NullPointerException e) { 
display.setText("File not found"); 
} 
} 

public static void main(String[] args) { 
    new FileLoader(); 

} 
} 

言うことですが、何らかの理由で、それは、addメソッドを見つけることができない、私は常にそれが自動的に輸入に拾われたと思った、これはそうではありませんか?どのようにこれをixできる? これはかなり軽薄な質問ですが、この部分のコンピュータサイエンスは完全に新しいものです。

とも私は私たちの最後のラボで

layout = new FlowLayout(); 
setLayout(layout); 

を使用し、代わりにそれはグリッドレイアウトでした。それは最後の時間を働いたが、この時間は、誰かが理由を説明してもらえますか?事前にありがとう

+0

あなたの説明から、以前のアプリケーションのMainクラスがJFrameを拡張していたようです。フィールドを呼び出すことなく、さまざまなコンポーネントなどを追加できます。今回は、実装されているインタフェースが青写真としてのみ動作することはもちろん、実装されていないクラスに対してadd()関数を呼び出そうとしています。このアプリケーションでは、JFrameを拡張せず、代わりにJFrameフィールドを作成します。あなたのアプリを正しく理解している場合は、単に「フレーム」を追加してください。あなたのadd()とsetLayout()の前に。 – Miekpeeps

答えて

0

あなたのコードで起こっていることは、継承の問題です。 JFrameを使ってクラスを拡張すると、そのすべてのメソッドを新しいサブクラスに借りることになります。下記の例1

public class GUIappExtend extends JFrame 
{ 
    public static void main(String[] args) 
    { 
     new GUIappExtend(); 
    } 

    public GUIappExtend() 
    { 
     setSize(200, 100); 
     setVisible(true); 
    } 
} 

ディスプレイを管理するメインクラスのJFrameフィールドを作成する別のオプションです。以下の実施例2:あなたが見ることができるように

public class GUIappNoExtend 
{ 
    public static void main(String[] args) 
    { 
     new GUIappNoExtend(); 
    } 
    public GUIappNoExtend() 
    { 
     JFrame frame = new JFrame(); 
     frame.setSize(200, 100); 
     frame.setVisible(true); 
    } 
} 

、例1で、私はちょうど私が呼んでいるものをフィールドから指定せずのsetSize()関数を呼び出すことができます。これは、これらの「隠された」関数をサブクラスに継承したためです。例2では、​​クラスはその名前の関数を所有していないので、関数setSize()を呼び出すことはできません。代わりに、JFrameからフィールドを作成し、そこでsetSize()関数を呼び出すことができます。

これは、アプリケーションのadd()およびsetLayout()関数でも同様です。私はこれがあなたに問題を明らかにすることを願っています。

TL; DR - この場合、add()およびsetLayout()関数はJFrameクラスに属します。ソースクラスがその名前で関数を所有している場合にのみ、これらの関数を呼び出すことができます。

+0

これは今コンパイルされます!プログラムを実行すると何も表示されず、GUIは表示されません – james

+0

これは正しいです。フレーム上で.setVisible(true)を呼び出して表示します。 – Miekpeeps

関連する問題