質問
私はJPanelの内のテキストを描画する方法の最も基本的な説明を探しています。私はそこ億チュートリアルがある知っているが、それらのどれも私と一緒にクリックされていないと私は混乱している人を助けるかもしれないいくつかの具体的な質問があります。セットアップ(テスト用アプリ)として、私はJLabelを、JTextFieldの、のJButton、とのJPanelを持つ単一のクラスを持っています。アプリケーションは、外部ファイルからint型に読み込み、JButtonのが押されたときにパネルにその平均を表示しなければなりません。私はすべての基本的なプログラミングの整理(つまり、ボタンが応答し、コマンドラインに平均値を出力し、である)が、私はちょうどパネルに平均を印刷する方法を整理することができないようです。私は私の最大の問題は、コードの残りの部分と一緒にして塗料()またはpaintComponet()メソッドを組み込む方法であると思います。それはそれ自身のクラスでなければなりませんか? JPanelのは、それ自身のクラスでなければなりませんか?それは、チュートリアルのほとんどは、私はちょうど最初のステップは、正確に何であるかわからないんだけど、私に言っているものだように思えます。コードは次のようになります:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Main extends JFrame implements ActionListener {
private int[] intArray = new int[10000];
private int numOfInts = 0;
private int avg = 0;
protected JButton avgBtn;
protected JTextField indexEntry;
protected JLabel instructions;
protected JPanel resultsPanel;
public Main(){
//create main frame
this.setTitle("Section V, question 2");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(350, 250);
this.setLayout(new GridLayout(4, 1));
//create instruction label and add to frame
instructions = new JLabel("Follow the instructions on the exam to use this program");
this.add(instructions);
//create textfield for index entry and add to frame
indexEntry = new JTextField();
this.add(indexEntry);
//create button for average and add to frame
avgBtn = new JButton("Click for Average");
this.add(avgBtn);
avgBtn.addActionListener(this);
//create panel to display results and add to frame
resultsPanel = new JPanel();
resultsPanel.setBackground(Color.BLUE);
this.add(resultsPanel);
//read in from file
readFromFile();
//compute average
computeAverage();
}
private void readFromFile() {
try {
// Open the file
FileInputStream fstream = new FileInputStream("numbers.dat");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
//create placeholder for read in ints
String strLine;
//Read File Line By Line
int i = 0;
while ((strLine = br.readLine()) != null) {
//place ints in array and increament the count of ints
System.out.println (strLine);
intArray[i] = Integer.parseInt(strLine);
numOfInts++;
i++;
}
//Close the input stream
in.close();
System.out.println ("numOfInts = " + numOfInts);
}
catch (Exception e) {
//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
//compute averaage
private void computeAverage() {
int sum = 0;
for (int i = 0; i < numOfInts; i++)
sum += intArray[i];
avg = sum/numOfInts;
System.out.println("avg = " + avg);
}
//event handling
public void actionPerformed(ActionEvent e) {
if(e.getSource() == avgBtn) {
computeAverage();
}
}
//"main" function
public static void main(String[] args) {
Main m = new Main();
m.setVisible(true);
}
//paint
public void paintComponent(Graphics g){
g.drawString(avg, 75, 75);
}
}
任意およびすべてのヘルプ/方向が理解されます。私はちょうどそれをすべて知ってほしい、私は他の質問については、最近、このコードを使用しました知っています!理想的には私が言ったように、ボタンがクリックされた、フォーカスがそれにあったときtextfeildに入力し、入力したものは何でも表示が押されたときにパネルがint型で、読み取りの平均を表示していましたが、私は赤ちゃんの手順を取っている、と、このスレッドは、太陽のドキュメントや他のサイトから答えを見つけていない同様の質問を他の人のための一般的なチュートリアルであるために私がしたいと思います。そんなに事前に感謝します。ダン:)
解決
自分のメインクラス内のJPanelを拡張する内部クラスを作成します:
class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(Integer.toString(avg), 75, 75);
}
}
そして、あなたがのactionPerformedでcomputeAverage()を呼び出した後、そのパネルに再描画を呼び出す必要があります:
//event handling
public void actionPerformed(ActionEvent e) {
if (e.getSource() == avgBtn) {
computeAverage();
panel.repaint();
}
}
他のヒント
のJPanelにJLabelのを追加します。
JLabelの上のsetText(String)を呼び出し、テキストはJPanelの内に描画されます。
1)A JFrameのは、paintComponent()メソッドを持っていません。あなたのカスタムペイントを行うには、カスタムJPanelのを作成し、そのpaintComponent()メソッドをオーバーライドする必要があります。
デフォルトでは、パネルはゼロサイズを持っているので、2)あなたが上記の操作を行う場合でも、絵はまだ表示されません。だから、あなたはそれが表示されていることを確認するために、パネルの推奨サイズを設定する必要があります。
3)なぜあなたもこれをやっています。すべてを行う必要があるのJLabelを使用してのJLabelのテキストを設定されています。
私はそれは難しいあなたが他のチュートリアルを見て信じることを見つけます。 20行を持っていのカスタムペイントのスイングのチュートリアル基本を示しプログラムます。
私はあなたのJFrameをサブクラス化すべきではないと思います。 JFrameのインスタンスのインスタンスを作成します
メインクラスの変数とそれになどのJPanelを追加します。