我试图实现一个以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();
}
}
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();
正如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();
}
}
代替
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上执行相同的查询时出错。在引发错误之前,图形会被部分解析,插入的三元组确实会显示在三元组存储中。 这是代码的一部分: 以下是错误: 导致错误的原因是什么?如何解决?