2014-01-09 70 views
0

我希望这个程序能够绘制用户输入的文字。我不知道如何让方法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); 

    } 
} 
+0

为什么要编写小程序?如果这是由于规格。由老师,请参考[为什么CS老师应该停止教Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/)。 –

+0

注意'输入'部分,这个applet可能会从'applet'元素的'param'元素中得到它的输入。这个'applet'元素可能会从HTML'form'(以及其他一些方式)获取它的数据。 –

回答

0

很抱歉,这是错误的:

n作为参数在paint

public void paint(Graphics g, String n) { 
... 
} 

正确的解决办法:

使你变n为类成员:

public class Bucky extends JApplet{ 
    String n; 
    ... 
} 
+0

是的,我错了。我忽略了类继承。 – Nicolai

2

您不应该将控制台输入与GUI代码混合。而是从JTextField或JOptionPane获取输入。

另外,不要直接在JApplet中绘制,而应该在JPanel的paintComponent方法中绘制,然后在applet中显示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); 
    } 

} 
+0

+1我甚至没有注意到, –

+0

感谢您的提示,现在不好处理。 – user3177987

+0

所以我改成了这一点: 公共类巴基延伸JApplet的{ 公共无效涂料(图形克){ 字符串n = JOptionPane.showInputDialog(“输入字符串来绘制”); 随机rand = new Random(); float red = rand。nextFloat(); float green = rand.nextFloat(); float blue = rand.nextFloat(); 颜色randomColor =新颜色(红色,绿色,蓝色); g.setColor(randomColor); g.drawString(n,100,100); } } 你是什么意思的“在方法中绘制并使用applet显示它”? – user3177987

0

“(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(); 
      } 
     }); 
    } 
}