JApplet Textfield/jbutton/programa de bucle anidado, crea un muro, ingresa el número de filas en el campo de texto

Estoy usando actualmente JCreator, y no puedo encontrar lo que está mal con mi código, por alguna razón no está leyendo lo que ingresé en el JTextField. No estoy buscando cambiar mi código drásticamente, si alguien pudiera señalar lo que hice mal, o darme algunos ejemplos de código de cómo debería verse, sería genial. de nuevo, sin buscar "esto es mejor que esto" cuando hacen lo mismo.

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();
    }   
}

preguntado el 28 de julio de 12 a las 02:07

Por favor aprenda Convenciones de nomenclatura de Java y apégate a ellos -

1 Respuestas

Tienes un código incorrecto en tu método de pintura, que incluye:

  • tienes un ciclo while (verdadero) en tu paint(...) método que bloqueará su GUI y evitará que responda a cualquier cosa.
  • Está intentando leer desde JTextField en un método llamado desde el método de pintura. Nunca debe tener lógica de programa en su código de pintura o en los métodos que llama.
  • No deberías estar anulando paint(...) de un JApplet para empezar, sino más bien paintComponent(...) en un JPanel que contiene el JApplet.
  • Considere agregar código para leer los JTextField(s) en su método actionPerformed, ya que parece ser el mejor lugar para esta lógica.

Editar

  • Nunca se llamará a su método de pintura, ya que no es una verdadera sobrecarga del método de pintura de JApplet. El tuyo tiene 2 parámetros y un método de pintura solo debe tener uno.
  • En su método actionPerformed, obtenga el valor de JTextField,
  • convertirlo en un int con Integer.parseInt(...) no un doble ya que nunca vas a dibujar una fracción de un ladrillo
  • y con el int obtenido establezca un campo de clase int, quizás llamado brickCount o algo así, y luego llame a repaint().
  • En tu JPanel paintComponent(...) método (que, como la pintura, solo debe tener un parámetro, Gráficos), llame paintBricks(), y haga que este método use el valor del campo brickCount para decidir cuántos ladrillos pintar.
  • Nunca llamar repaint() desde adentro paint(...) paintComponent(...) o desde cualquier método llamado desde estos métodos.

Editar 2

Aquí hay un ejemplo que no hace lo que su programa necesita hacer, pero ilustra cómo obtener información de un JTextField y usarlo en un dibujo:

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();
   }
}

Esto resultará en lo siguiente:
enter image description hereenter image description here

Respondido 28 Jul 12, 14:07

bien, entiendo todo excepto la pintura predominante. También estoy un poco confundido en cuanto a dónde debo llamar al Método DrawBricks. de lo contrario nunca será llamado. ¿es esto lo que debería b en el oyente de acción también? Soy moderadamente nuevo en Java si (event.getText() == tf){ String Value = tf.getText(); BrickNumbers = Double.parseDouble(Valor); } - user1547182

@ user1547182: edita su pregunta original y coloca el código allí. Por favor, esfuércese por formatearlo bien, ya que no quiere dificultar que otros lean y entiendan su código. - Aerodeslizador lleno de anguilas

Echa un vistazo a docs.oracle.com/javase/tutorial/uiswing, en particular, la sección "Realización de pintura personalizada" - Programador loco

@ user1547182: vea el programa de ejemplo para ver de lo que estoy hablando. - Aerodeslizador lleno de anguilas

@HovercraftFullOfEels: Eeeeeeeeeeeeeeeee (tirando de mi cabello) :-), mientras revisaba el código proporcionado, me di cuenta de que el init() el método no está usando SwingUtilities.invokeLater(...)/invokeAndWait(), por lo que parece que al ejemplo le falta la parte EDT :( - cOw nIcE

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.