1

私は現在 を使用してJCreatorいますが、自分のコードの何が問題なのかを見つけることができません。何らかの理由で、JTextField. コードを大幅に変更するつもりはありません。どこが間違っていたかを指摘したり、どのように見えるかのコード例をいくつか教えていただければ、それは素晴らしいことです。繰り返しますが、同じことをするときに「これはこれよりも優れている」とは考えていません。

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

public class Wall extends JApplet implements ActionListener {

    double count;
    Boolean Submit = false;
    JButton btn1;
    JTextField  tf,field;
    int x = 0;
    int y = 575;
    int x1 = 50;
    int y1 = 25;
    int textnumber;
    Random randomNum = new Random();//initialize random variable
    int count2;

    public void init() {

        setLayout( new FlowLayout( ) );
        tf = new JTextField(5);
        field = new JTextField( "<===== Enter Brick Rows 1-20", 16 );   
        add( tf );  
        add( field );
        btn1 = new JButton("Submit");
        add(btn1);
        btn1.addActionListener(this);
    }

    public void actionPerformed(ActionEvent event){

        if (event.getSource()== btn1){
            Submit = true;
        }
    }

    public void paint(Graphics g, double BrickNumbers) {

        super.paint(g);
        while(Submit == true){
            DrawBrick(g,BrickNumbers);
        }
    }

    public void DrawBrick(Graphics g, double BrickNumbers){

        String Value = tf.getText();
        BrickNumbers = Double.parseDouble(Value);

        if(Submit == true){
            count = BrickNumbers;
            for(double count = BrickNumbers; ((count>=1) && (count <=20)); count--){

                int d = 1+ randomNum.nextInt(255);//get d variable
                int e = 1+ randomNum.nextInt(255);//get e variable
                int f = 1+ randomNum.nextInt(255);//get f variable
                Color randomcolor = new Color(d,e,f);
                g.setColor(randomcolor);
                g.fillRect(x, y, x1, y1);
                g.fillRect(x+ 50, y, x1, y1);
                g.fillRect(x+100, y, x1, y1);
                g.fillRect(x+150, y, x1, y1);
                g.fillRect(x+200, y, x1, y1);
                g.fillRect(x+250, y, x1, y1);   
                y = y - 25;
            }
        }
        repaint();
    }   
}
4

1 に答える 1

5

描画方法に次のような悪いコードがあります。

  • メソッドに while (true) ループがpaint(...)あり、GUI がロックされてにも応答しなくなります。
  • paint メソッドから呼び出されたメソッドで JTextField から読み込もうとしています。描画コードやそれが呼び出すメソッドにプログラム ロジックを含めるべきではありません。
  • そもそも JApplet をオーバーライドpaint(...)するのではなくpaintComponent(...)、JApplet が保持する JPanel でオーバーライドする必要があります。
  • actionPerformed メソッドに JTextField を読み取るためのコードを追加することを検討してください。このロジックに最適な場所と思われるためです。

編集

  • JApplet の paint メソッドの真のオーバーロードではないため、paint メソッドが呼び出されることはありません。あなたのものには2つのパラメーターがあり、ペイントメソッドには1つしかありません。
  • actionPerformed メソッドで、JTextField から値を取得します。
  • Integer.parseInt(...)レンガの一部を描画することは決してないので、double ではないint に変換します
  • 取得した int を使用して、brickCount などと呼ばれる int クラス フィールドを設定し、repaint() を呼び出します。
  • JPanel のpaintComponent(...)メソッド (paint と同様、Graphics という 1 つのパラメーターのみを持つ必要があります) で を呼び出しpaintBricks()、このメソッドに、brickCount フィールド値を使用して、ペイントするレンガの数を決定させます。
  • repaint()これらのメソッド内から呼び出されたメソッド内paint(...) paintComponent(...)から、またはメソッドから呼び出してはいけません。

編集 2

次の例は、プログラムで必要なことを実行するものではありませんが、JTextField から情報を取得して描画で使用する方法を示しています。

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

public class SimpleApplet extends JApplet {
   @Override
   public void init() {
      getContentPane().add(new SimpleAppletMainPanel());
   }
}

class SimpleAppletMainPanel extends JPanel {
   private static final Color CIRCLE_COLOR = Color.red.darker();
   private static final int CIRCLE_STROKE_WIDTH = 10;
   private static final int GAP = 3;
   private static final Stroke CIRCLE_STROKE = new BasicStroke((float)CIRCLE_STROKE_WIDTH);
   private JTextField textField = new JTextField(5);
   private JButton myButton = new JButton("Submit");
   private int count = 0;

   public SimpleAppletMainPanel() {
      ActionListener actionListener = new ActionListener() {
         public void actionPerformed(ActionEvent arg0) {
            try {
               count = Integer.parseInt(textField.getText());
               repaint();
            } catch (NumberFormatException e) {
               e.printStackTrace();
            }
         }
      };
      myButton.addActionListener(actionListener);
      textField.addActionListener(actionListener);
      add(new JLabel("Enter a number, 1-10:"));
      add(textField);
      add(myButton);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      for (int i = 0; i < count; i++) {
         drawCircle(g, i);
      }
   }

   private void drawCircle(Graphics g, int layer) {
      int centerX = getWidth() / 2;
      int centerY = getHeight() / 2;
      int radius = layer * (CIRCLE_STROKE_WIDTH + GAP) + GAP;
      int x = centerX - radius ;
      int y = centerY - radius;

      Graphics2D g2b = (Graphics2D) g.create();
      g2b.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2b.setStroke(CIRCLE_STROKE);

      g2b.setColor(CIRCLE_COLOR);
      g2b.drawOval(x, y, radius * 2, radius * 2);

      g2b.dispose();
   }
}

これにより、次のようになります。
ここに画像の説明を入力ここに画像の説明を入力

于 2012-07-28T01:43:19.780 に答える