【问题标题】:No output after button click, since the variable doesn't exist?单击按钮后没有输出,因为变量不存在?
【发布时间】:2020-01-02 16:35:09
【问题描述】:

我想要一个带有一个 TextArea 和一个 Button 的框架。 当我按下按钮时,TextArea 应该显示 5 个比萨饼的食物菜单,它什么都没有显示,除了控制台显示

"Exception in thread "AWT-EventQueue-0"  
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at de.kvwl.pizza.MainFrame.actionPerformed(MainFrame.java:54)"

在 windowsStart() 方法中,对象存在并且可以调整。 在 actionPerformed() 方法中,对象是……某种不可见的,不存在的?

public void windowStart()
{
    MainFrame mFrame = new MainFrame();
    PizzaReader2 test = new PizzaReader2();
    pPizza = test.csvRead();

    System.out.println("\n\n\n" + pPizza.get(0) + "\n\n\n");

    f = new JFrame("Textfield");
    b = new JButton("Menu");
    jt = new JTextArea(10,10);
    JPanel pTextArea = new JPanel();
    b.addActionListener(mFrame);

    pTextArea.add(jt);
    pTextArea.add(b);
    f.add(pTextArea);

    f.setSize(300, 300);
    f.setVisible(true);
}
public void actionPerformed(ActionEvent e) 
{    
    //jt.setText("TestText");
    System.out.println("\n\n\n" + pPizza.get(0) + "\n\n\n");

    String s = e.getActionCommand(); 
    if (s.equals("Menu")) 
    { 
        System.out.println("Button gedrückt");
        //jt.setText("");
        for (int i = 0; i < pPizza.size(); i++) 
        {
            jt.append(pPizza.get(i)+"\n");
        }

TextArea 应该获取 ArrayList 的值

【问题讨论】:

  • 设置jt.setText("TestText");时是否有效?
  • 不,他也没有找到 jt :/
  • 我认为您的 TextField 没有问题。 IndexOutOfBoundsException 看起来您的列表为空。您是否尝试将列表打印到控制台?第 54 行可能是您调用 System.out.println("\n\n\n" + pPizza.get(0) + "\n\n\n"); 的行
  • Array 和 List 在这种情况下使用相同的逻辑。当您尝试获取索引 0 处的值时,您的列表为空,如异常消息“Index: 0, Size: 0”中所述。

标签: java swing jbutton indexoutofboundsexception


【解决方案1】:

您的异常发生在:at de.kvwl.pizza.MainFrame.actionPerformed(MainFrame.java:54)

此操作在windowStart 期间与b.addActionListener(mFrame); 相关联。

但我看到的是,您传递了另一个名为 mFrameMainFrame 实例作为参数(作为 ActionListener)。这个mFrame 永远不会用

加载列表
pPizza = test.csvRead();

简而言之,你有两个实例MainFrame

  • 创建并用于调用windowStart
  • windowsStart 中创建并用于执行actionPerformed

最后一个从不加载数据列表。解释为什么您的列表填充在windowStart 而不是actionPerformed,您实际上是在使用两个不同的实例MainFrame 和两个列表pPizza

您可以通过删除第二个实例并使用this 来纠正此问题,第一个实例作为ActionListener

b.addActionListener(this);

【讨论】:

  • 这就是问题所在,非常感谢。并感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2015-09-11
  • 1970-01-01
相关资源
最近更新 更多