2015-09-24 2 views
1

Я довольно новичок в программировании, и я решил принять введение в класс java. У меня есть задание, где я должен создать стену, используя цикл for, который изменяет высоту стены на основе пользовательского ввода. Я думаю, что я получил большую часть кода, но я не могу подключить пользовательский ввод с циклом for. Любая помощь будет оценена по достоинству.Как нарисовать стену в методе краски на основе ввода пользователем

//Package List 
import java.awt.*; 
import java.applet.*; 
import javax.swing.*; 
import java.util.*; 
import java.awt.event.*; 

public class Wall extends JApplet implements ActionListener{ 

//Component declaration 
JLabel directions; 
JTextField input = new JTextField(10); 
private JButton go; 
//Variable declaration 
int userinput; 


//Method declaration 
public void init() 
{ 
    getContentPane().setBackground(new Color (128, 128, 128));//Changes backround of JApplet to black 
    //Set JButton and JLabel 
    setLayout (new FlowLayout()); 
    directions = new JLabel("Enter in any number between 1 and 20 and then press Enter on your keyboard."); 
    go = new JButton("Go!"); 
    go.setBackground(Color.GREEN); 
    go.setFocusPainted(false); 
    go.addActionListener(this); 
    add (directions); 
    add (input); 
    add(go); 
} 

public void actionPerformed(ActionEvent ae) 
{ 
    String text = input.getText(); 
    userinput = Integer.parseInt(text); 
    repaint(); 
} 

//Method declaration 
public void paint(Graphics g) 
{ 
    super.paint(g); 
    int startX = 50; 
    int startY = 650; 
    int width = 50; 
    int height = 20; 
    int spacing = 2; 
    int xOffset = 0; 
    for (int row = 0; row < userinput; row++) { 
     int y = startY + (row * (height + spacing)); 
     if (row % 2 == 0) { 
      xOffset = width/2; 
     } else { 
      xOffset = 0; 
     } 
     for (int col = 0; col < 8; col++) { 
      int x = xOffset + (startX + (col * (width + spacing))); 
      System.out.println(x + "x" + y); 
      g.setColor(Color.RED); 
      g.fillRect(x, y, width, height); 
     } 
} 
} 
} 
+0

Ваш код работает, но ваше смещение' y' должно быть большим – MadProgrammer

ответ

1

В принципе, ваш код работает, но ваш starty является большой и, кажется, картина с экрана.

Как правило, следует избегать переопределения paint контейнеров верхнего уровня, таких как JApplet (почему используются апплеты?), Вместо этого вместо этого используйте компонент, например JPanel.

Несколько причин для этого, но тот, с которым вы столкнетесь, состоит в том, что paint может рисовать над дочерними компонентами, НО, из-за того, как работают картины, эти дочерние компоненты, когда обновляется, могут рисовать то, что у вас есть окрашенный ... который в целом, просто странный для пользователя.

Вместо разделение вы код на логические единицы, каждая единица должна нести ответственность за единый блок (логика) работает

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Wall extends JApplet implements ActionListener { 

//Component declaration 
    JLabel directions; 
    JTextField input = new JTextField(10); 
    private JButton go; 

    private WallPanel wallPanel; 

//Method declaration 
    public void init() { 
     getContentPane().setBackground(new Color(128, 128, 128));//Changes backround of JApplet to black 
     //Set JButton and JLabel 
     setLayout(new BorderLayout()); 

     JPanel controls = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     directions = new JLabel("Enter in any number between 1 and 20 and then press Enter on your keyboard."); 
     go = new JButton("Go!"); 
     go.setBackground(Color.GREEN); 
     go.setFocusPainted(false); 
     go.addActionListener(this); 
     controls.add(directions, gbc); 
     controls.add(input, gbc); 
     controls.add(go, gbc); 

     wallPanel = new WallPanel(); 

     add(controls, BorderLayout.NORTH); 
     add(wallPanel); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     String text = input.getText(); 
     wallPanel.setRowCount(Integer.parseInt(text)); 
     repaint(); 
    } 

    public class WallPanel extends JPanel { 

     private int rowCount; 

     public void setRowCount(int rowCount) { 
      this.rowCount = rowCount; 
      repaint(); 
     } 

     public int getRowCount() { 
      return rowCount; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int startX = 50; 
      int startY = 0; 
      int width = 50; 
      int height = 20; 
      int spacing = 2; 
      int xOffset = 0; 
      for (int row = 0; row < getRowCount(); row++) { 
       int y = startY + (row * (height + spacing)); 
       if (row % 2 == 0) { 
        xOffset = width/2; 
       } else { 
        xOffset = 0; 
       } 
       for (int col = 0; col < 8; col++) { 
        int x = xOffset + (startX + (col * (width + spacing))); 
        g.setColor(Color.RED); 
        g.fillRect(x, y, width, height); 
       } 
      } 
     } 

    } 
} 

Так, в принципе, все, что я сделал здесь, это переместить «настенную живопись »к его собственному компоненту/классу и предоставил простой сеттер (и getter) для изменения количества строк.

+0

Большое вам спасибо! Я не понимал, что начало было настолько велико. И спасибо за дополнительные советы тоже, очень ценится. –

+0

Рад, что это помогло;) – MadProgrammer