use*_*182 1 java swing paintcomponent japplet
我目前正在使用JCreator,并且无法找到我的代码有什么问题,由于某种原因它不能读取我输入的内容JTextField.我不打算彻底改变我的代码,如果any1可以指出我做错了什么,或者给我一些它应该是什么样的代码示例,这将是很好的.再次,当他们做同样的事情时,不要寻找"这比这更好".
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();
}
}
Run Code Online (Sandbox Code Playgroud)
你的绘画方法中有一些不好的代码,包括:
paint(...)它会锁定你的GUI并防止它响应任何东西.paint(...)JApplet,而应该覆盖paintComponent(...)JApplet所持有的JPanel.编辑
Integer.parseInt(...)不带双精度的int,因为你永远不会画一小块砖paintComponent(...)方法(类似paint应该只有一个参数,Graphics),调用paintBricks(),并让这个方法使用brickCount字段值来决定要绘制多少砖.repaint()从内部paint(...) paintComponent(...)或从这些方法中调用的任何方法调用.编辑2
这是一个不执行程序需要做的示例,但说明了如何从JTextField获取信息并在图形中使用它:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致以下结果:

