当前位置: 首页 > 知识库问答 >
问题:

数组索引错误将 JPanel 动态插入选项卡式面板时出现异常

阎涵忍
2023-03-14

我试图实现一个以JTabbedPane为主要组件的JFrame(这是JFrame的唯一组件)。开始时,选项卡式面板不应包含任何选项卡。后者是在事件发生时添加的。每个选项卡包含一个带有BorderLayout的JPanel。这是我遇到一些问题的那段代码。实际上,当添加选项卡时,我得到了一个ArrayIndexOutOfBoundException。我已经确定了产生错误的代码行,当我将第二个元素添加到面板时,就会出现错误。有人知道如何修复这个错误吗?我试图捕捉错误,但它不起作用。这是我现在的实现:

这是主机架的代码

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class MyFrame extends JFrame {

    static JTabbedPane main;

    public MyFrame() {
        main = new JTabbedPane();
        this.add(main);
        this.setMinimumSize(new Dimension(600, 800));
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
    }

    public static JPanel addTab(String title) {
        MyPanel panel = new MyPanel();
        main.addTab(title, panel);
        return panel;
    }
}

这是选项卡式面板中面板的类:

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneLayout;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class MyPanel extends JPanel {
    private JPanel scrollPanel;
    private JTextArea textArea;
    private JButton button;
    public MessageTo panel;

    public MyPanel() {

        JScrollPane scrollPane = new JScrollPane(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setLayout(new ScrollPaneLayout());
        scrollPanel = new JPanel();
        scrollPane.setViewportView(scrollPanel);
        scrollPanel.setLayout(new BoxLayout(scrollPanel, BoxLayout.Y_AXIS));

        textArea = new JTextArea();
        Border roundedBorder = new LineBorder(Color.black, 1, true);
        textArea.setBorder(roundedBorder);

        button = new JButton("Send");
        JPanel panel1 = new JPanel();
        panel1.setBorder(new EmptyBorder(0, 10, 0, 0));
        panel1.add(button);

        JPanel inner_panel = new JPanel();
        inner_panel.setLayout(new BorderLayout());
        inner_panel.add(panel1, BorderLayout.EAST);
        inner_panel.add(textArea, BorderLayout.CENTER);
        inner_panel.setBorder(new EmptyBorder(10, 10, 10, 10));

        this.setLayout(new BorderLayout());
        this.add(scrollPane, BorderLayout.CENTER);
        this.add(inner_panel, BorderLayout.SOUTH); // This line produces the error
    }
}

这是我的错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at javax.swing.plaf.basic.BasicTabbedPaneUI.tabForCoordinate(BasicTabbedPaneUI.java:1506)
at javax.swing.plaf.basic.BasicTabbedPaneUI.setRolloverTab(BasicTabbedPaneUI.java:575)
at javax.swing.plaf.basic.BasicTabbedPaneUI.access$2000(BasicTabbedPaneUI.java:54)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mouseEntered(BasicTabbedPaneUI.java:3626)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6281)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4872)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4698)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4620)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4474)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4698)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747)
at java.awt.EventQueue.access$300(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:706)
at java.awt.EventQueue$3.run(EventQueue.java:704)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:720)
at java.awt.EventQueue$4.run(EventQueue.java:718)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:717)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

谢谢!

编辑:

这是可以用来测试我的代码的代码:

public class Main {

    public static MyFrame frame;

    public static void main(String[] args)   {

        frame = new MyFrame();
        new Thread() {
            public void run() {
                frame.addTab("Test");
            }
        }.start();
    }

}

共有3个答案

商兴朝
2023-03-14
import javax.swing.SwingWorker;

请在这里读到这个…https://docs.oracle.com/javase/tutorial/uiswing/concurrency/simple.html

    new SwingWorker() {
      @Override protected Void doInBackground() throws Exception {
        return null;
      } 
      @Override protected void done() {
        //PUT HERE THE CODE
        frame.addTab("Test");
        frame.addTab("Test2");
      }
    }.execute();
周祺
2023-03-14

正如Kiheru所建议的,通过修改另一个线程的帧必须以这种方式完成:

public class Main {

    public static MyFrame frame;

    public static void main(String[] args) throws InterruptedException,
            ExecutionException, UnknownHostException, IOException {

        frame = new MyFrame();
        new Thread() {
            public void run() {
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        frame.addTab("Test");
                    }
                });
                try {
                    this.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        frame.addTab("Test2");
                    }
                });
            }
        }.start();
    }
}
谷梁嘉运
2023-03-14

代替

   new Thread() {
        public void run() {
            frame.addTab("Test");
        }
    }.start();

随着

frame.addTab("Test");

此时,您正试图从另一个线程修改GUI元素,而不是您的< code>JFrame所在的线程。有可能添加制表符的代码在程序完成构建窗口之前就已经到达了,因此出现了错误。Swing中的并发可能是一个很好的读物。

 类似资料:
  • 新数组列表 我用多头填充这个数组列表。 当我试图将其插入postgresql时,我使用以下方法: 使用JDBC模板。但是当我试图运行这段代码时,它在“ARRAY[?]”上给出了一个错误。但如果temp2是一个单一的数字,比如:1253214,它就可以工作。有人有主意吗? 我的错误是: PreparedStatementCallback;错误的SQL语法[UPDATE pb1plnitm SET p

  • 我正在将CSV文件插入MongoDB。首先,我将CSV转换为Json格式的数组(参考:https://dzone.com/articles/how-to-convert-csv-to-json-in-java)然后尝试将其上载到MongoDB,但遇到以下错误(只有当CurrentBSONType为DOCUMENT时,才能调用readStartDocument,而当CurrentBSONType为A

  • 我有一个应用程序,包括使用ActionBarSherlock在标签模式。我有5个标签,每个标签的内容都是使用片段处理的。然而对于tab2,我有一个片段,其中的xml文件包含一个ViewPager元素,该元素反过来又有一些片段页面。当我最初启动应用程序时,我可以在选项卡之间切换,没有问题,但是当我第二次按下选项卡2时,我就会出现上面提到的错误。主要活动如下: 不带ViewPager的fragment

  • 问题内容: 我正在尝试在MS Access中的表上进行操作。一切正常 一个声明。但是当执行其他三个操作时,我似乎什么也没得到 错误,但操作未反映在数据库上。请帮忙… 该声明如下: 我也可以知道为什么除了SELECT语句之外使用… 我收到此错误: 这是我的代码… 问题答案: 当您不提交 / 关闭连接时,可能会发生这种情况。确保在执行该语句之后提交连接,并在获取和执行它们的块的块中关闭连接(以及语句和

  • 我正在尝试编写一段代码来索引搜索一个值,如果它存在于数组中。以下是代码的样子: 每次我运行代码时,在将值输入数组时,它都会给我这个空指针异常:线程“main”java中的异常。lang.NullPointerException:无法存储到int数组,因为在indexSearch处“[]”为null。main(indexSearch.java:22) 为什么会这样,我该如何修复它?

  • 我将数据库解析为RDFlib图。现在我想把这个图中的三元组插入GraphDB三元组存储。当我在Sesame上托管的GraphDB Lite的旧版本上执行时,代码运行良好。然而,我在现在独立的GraphDB 7.0.0上执行相同的查询时出错。在引发错误之前,图形会被部分解析,插入的三元组确实会显示在三元组存储中。 这是代码的一部分: 以下是错误: 导致错误的原因是什么?如何解决?