我希望这个程序能够绘制用户的写作输入。我不知道如何使方法paint
将输入n
作为变量(n
无法解析为变量)。
package naplety;
import java.awt.*;
import javax.swing.*;
import java.util.Scanner;
import java.awt.color.*;
import java.util.Random;
public class Bucky extends JApplet{
public void ustaw(){
Scanner input = new Scanner(System.in);
String n = input.next();
input.close();
}
public void paint(Graphics g){
Random rand = new Random();
float red = rand.nextFloat();
float green = rand.nextFloat();
float blue = rand.nextFloat();
Color randomColor = new Color(red,green,blue);
g.setColor(randomColor);
g.drawString(n, 100, 100);
}
}
您不应该将控制台输入与 GUI 代码混合使用。而是从JTextField或JOptionPane获取输入。
另外,切勿直接在 JApplet 中绘制,而是在 JPanel 的 paintComponent 方法中绘制,然后在小程序中显示 JPanel。
我自己,我会在 JLabel 中显示文本:
import java.awt.*;
import javax.swing.*;
import java.util.Random;
public class Bucky extends JApplet {
private String s = "";
private JLabel label = new JLabel("", SwingConstants.CENTER);
@Override
public void init() {
Random rand = new Random();
float red = rand.nextFloat();
float green = rand.nextFloat();
float blue = rand.nextFloat();
Color randomColor = new Color(red, green, blue);
label.setForeground(randomColor);
add(label);
s = JOptionPane.showInputDialog(this, "Enter a String");
label.setText(s);
}
}
抱歉,这是错误的:
将n
作为参数传递paint
:
public void paint(Graphics g, String n) {
...
}
正确的解决方案:
将变量n
为类成员:
public class Bucky extends JApplet{
String n;
...
}
"( n 不能解析为变量) "
n
不在paint
方法的范围内。您需要将其移动为类成员
String n; <--------
public void ustaw() {
Scanner input = new Scanner(System.in);
n = input.next();
input.close();
}
除此之外,关于GUI程序,您应该了解一件事。它是事件驱动的。组件触发事件,这些事件是其他组件的侦听器。假设按下了一个按钮。按下按钮会向侦听器触发事件,侦听器会在触发事件时提供一些要执行的操作。因此,如果您想从用户那里获得输入,则需要类似文本字段的内容。您需要将侦听器注册到该文本字段,侦听器将说出要执行的操作。请参阅下面的示例,我只是使用了您输入的文本字段的示例,当您按 Enter 时,面板会绘制字符串
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import stackoverflow.Bucky.DrawPanel;
import templates.GUI;
public class BuckyGUI {
String n = "Hello";
JTextField jtf = new JTextField(15);
BuckyPanel panel = new BuckyPanel();
public BuckyGUI() {
JFrame frame = new JFrame();
frame.add(panel, BorderLayout.CENTER);
frame.add(jtf, BorderLayout.NORTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
jtf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
n = jtf.getText();
panel.repaint();
}
});
}
public class BuckyPanel extends JPanel{
private static final int D_W = 250;
private static final int D_H = 250;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(n, 125, 125);
}
public Dimension getPreferredSize() {
return new Dimension(D_W, D_H);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new BuckyGUI();
}
});
}
}