【问题标题】:Java while loop to draw linesJava while循环画线
【发布时间】:2012-09-23 17:19:01
【问题描述】:

大家好,我正在尝试从 Java 书籍中做一个练习,我需要做的是画线,并且在文本字段中我必须说明线之间的距离必须有多远。所有这些都必须在一个循环中,所以没有硬编码的行。

我已经按照我认为应该完成的方式完成了所有工作,但是我的控制台中出现了一些奇怪的错误,并且不断出现。错误代码如下:

线程“AWT-EventQueue-0”中的异常 java.lang.NumberFormatException:对于输入字符串:“” 在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 在 java.lang.Integer.parseInt(Integer.java:470) 在 java.lang.Integer.parseInt(Integer.java:499) 在 h03.LinePanel.paintComponent(LinePanel.java:30) 在 javax.swing.JComponent.paint(JComponent.java:1037) 在 javax.swing.JComponent._paintImmediately(JComponent.java:5106) 在 javax.swing.JComponent.paintImmediately(JComponent.java:4890) 在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:812) 在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714) 在 javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694) 在 javax.swing.RepaintManager.access$700(RepaintManager.java:41) 在 javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1672) 在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:702) 在 java.awt.EventQueue.access$400(EventQueue.java:82) 在 java.awt.EventQueue$2.run(EventQueue.java:663) 在 java.awt.EventQueue$2.run(EventQueue.java:661) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:672) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

因为我是 Java 新手,所以我不知道我做错了什么以及如何解决此错误,因此我将不胜感激!我用于此的面板中的代码是

DrawLines lines = new DrawLines();

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    int positionY = getHeight() - Integer.parseInt(afstand.getText()); // absolut positioning

    int yPos = 0;

    while(yPos <= positionY) {

        lines.drawLines(g, 0, yPos, getWidth(), yPos);
        yPos = yPos + Integer.parseInt(afstand.getText());
    }

}

public void actionPerformed(ActionEvent e) {

    try {

        repaint();


    }
    catch(NumberFormatException err) {

        JOptionPane.showMessageDialog(null, "something went wrong! heeft u wel    een waarde opgegeven?");

    }

}

【问题讨论】:

    标签: java


    【解决方案1】:

    问题正是它所说的:你在一个空字符串上调用Integer.parseInt(),在你的例子中:afstand.getText(),它不喜欢它。

    java.lang.NumberFormatException: For input string: "" at
    [...]
    java.lang.Integer.parseInt(Integer.java:470) at java.lang.Integer.parseInt(Integer.java:499)
    

    为了避免异常,您可以捕获异常:

    try {
        int input = Integer.parseInt(afstand.getText());
        //rest of your code
    } catch (NumberFormatException e) {
        //let the use know that the entry is invalid
    }
    

    【讨论】:

    • 我想添加一个建议,即在尝试将其解析为整数之前检查输入的非数字字符。
    • 但是当我开始调试时它为什么已经检查了文本字段?我的意思是它不在构造函数中,所以它必须等到我输入一个值或者我想错了?
    • @Fildor 我已经这样做了——尽管检查可能应该在组件本身中完成,例如通过 Document,而不是在 paintComponent 方法中。
    • @Reshad paintComponent 在您的组件可见时立即被调用 - 这意味着您还没有时间输入任何内容(除非您在显示之前填充该字段)。
    • @assylias 我同意。我猜这是一个特例。
    【解决方案2】:

    getText().toString() 以获取您的文本字段的值。您可以尝试 System.out.println(afstand.getText) 并使用 toString 来查看差异。

    否则您的文本字段中没有整数值。

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2018-07-07
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2010-11-26
      • 2014-03-29
      相关资源
      最近更新 更多