Java 如何在基于用户输入的绘制方法中绘制墙

Java 如何在基于用户输入的绘制方法中绘制墙,java,swing,for-loop,repaint,Java,Swing,For Loop,Repaint,我对编程相当陌生,我决定介绍一下java类。我有一个任务,我必须使用for循环创建墙,该循环根据用户输入更改墙的高度。我想我大部分代码都是对的,但我似乎无法将用户输入与for循环连接起来。任何帮助都将不胜感激 //Package List import java.awt.*; import java.applet.*; import javax.swing.*; import java.util.*; import java.awt.event.*; public class Wall ext

我对编程相当陌生,我决定介绍一下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);
        }
}
}
}
//包列表
导入java.awt.*;
导入java.applet.*;
导入javax.swing.*;
导入java.util.*;
导入java.awt.event.*;
公共类Wall扩展JApplet实现ActionListener{
//组件声明
JLabel方向;
JTextField输入=新的JTextField(10);
私人吉布顿围棋;
//变量声明
int用户输入;
//方法声明
公共void init()
{
getContentPane().setBackground(新颜色(128、128、128));//将JApplet的背面改为黑色
//设置JButton和JLabel
setLayout(新的FlowLayout());
方向=新的JLabel(“输入1到20之间的任意数字,然后按键盘上的Enter键”);
go=新的JButton(“go!”);
go.setBackground(颜色为绿色);
go.SetFocuspaint(假);
go.addActionListener(这个);
添加(指示);
添加(输入);
加(去);
}
已执行的公共无效行动(行动事件ae)
{
String text=input.getText();
userinput=Integer.parseInt(文本);
重新油漆();
}
//方法声明
公共空间涂料(图g)
{
超级油漆(g);
int startX=50;
int startY=650;
整数宽度=50;
整数高度=20;
int间距=2;
int xOffset=0;
for(int row=0;row
基本上,您的代码可以正常工作,但是您的
starty
太大了,似乎在屏幕上画画

通常,您应该避免覆盖顶级容器(如
JApplet
)(为什么要使用applet?!)的
paint
,而是使用
JPanel
之类的组件

这有几个原因,但您将遇到的一个原因是,
paint
可以在子组件上绘制,但是,由于绘制的工作方式,这些子组件在更新时可以在您绘制的内容上绘制。。。总的来说,这对用户来说很奇怪

相反,将代码分成逻辑单元,每个单元应负责单个单元(逻辑)的工作

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JApplet;
导入javax.swing.JButton;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
公共类Wall扩展JApplet实现ActionListener{
//组件声明
JLabel方向;
JTextField输入=新的JTextField(10);
私人吉布顿围棋;
私人墙板;
//方法声明
公共void init(){
getContentPane().setBackground(新颜色(128、128、128));//将JApplet的背面改为黑色
//设置JButton和JLabel
setLayout(新的BorderLayout());
JPanel controls=newjpanel(newgridbaglayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
方向=新的JLabel(“输入1到20之间的任意数字,然后按键盘上的Enter键”);
go=新的JButton(“go!”);
围棋。挫折背景(颜色。绿色);
go.SetFocuspaint(假);
go.addActionListener(这个);
控件。添加(方向,gbc);
控件。添加(输入,gbc);
控件。添加(go、gbc);
墙板=新墙板();
添加(控件,BorderLayout.NORTH);
添加(墙板);
}
已执行的公共无效行动(行动事件ae){
String text=input.getText();
setRowCount(Integer.parseInt(text));
重新油漆();
}
公共类墙板扩展JPanel{
私有整数行数;
公共void setRowCount(int rowCount){
this.rowCount=rowCount;
重新油漆();
}
public int getRowCount(){
返回行计数;
}
@凌驾
受保护组件(图形g){
超级组件(g);
int startX=50;
int startY=0;
整数宽度=50;
整数高度=20;
int间距=2;
int xOffset=0;
对于(int row=0;row

所以,基本上,我在这里所做的就是将“墙画”移动到它自己的组件/类中,并提供了一个简单的setter(和getter)来更改行数

您的代码可以工作,但是您的
y
偏移量非常感谢您!我没意识到开始y这么大。谢谢你的额外提示,非常感谢。
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);
                }
            }
        }

    }
}