Java 如何在基于用户输入的绘制方法中绘制墙
我对编程相当陌生,我决定介绍一下java类。我有一个任务,我必须使用for循环创建墙,该循环根据用户输入更改墙的高度。我想我大部分代码都是对的,但我似乎无法将用户输入与for循环连接起来。任何帮助都将不胜感激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
//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);
}
}
}
}
}