JApplet Textfield/jbutton/programa de bucle anidado, crea un muro, ingresa el número de filas en el campo de texto
Frecuentes
Visto 1,574 equipos
1
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();
}
}
1 Respuestas
5
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 bienpaintComponent(...)
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), llamepaintBricks()
, y haga que este método use el valor del campo brickCount para decidir cuántos ladrillos pintar. - Nunca llamar
repaint()
desde adentropaint(...)
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:
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 java swing paintcomponent japplet or haz tu propia pregunta.
Por favor aprenda Convenciones de nomenclatura de Java y apégate a ellos - nIcE cOw