import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class GameFrame extends JFrame{ int[] ta = new int[6];
JTable bill;
JScrollPane pn = new JScrollPane(bill); public GameFrame(){
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setLayout(null);
bill = new JTable(fun(ta)){
public boolean isCellEditable(int rowIndex, int columnIndex){
return false; //设置单元格不可编辑
}
};
pn.setBounds(100, 100, 600, 400);
this.add(pn);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
new Thread(new BillThread()).start();
} private class BillThread implements Runnable{
public void run() {
while(true){
bill.setModel(fun(ta));
pn.getViewport().add(bill,null);
pn.revalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<6;i++)
ta[i] += 1;
}
}
} private DefaultTableModel fun(int[] a){
Object[] billTitle = {"标题1","标题2","标题3"}; //定义标题
Object[][] billTable = {
{a[0],a[1],a[2]},
{a[3],a[4],a[5]}
};
DefaultTableModel model;
model = new DefaultTableModel(billTable,billTitle);
return model;
}
public static void main(String[] args) {
new GameFrame();
}}我需要做个表格,然后每1秒刷新一次,
为什么运行几秒后报错啊
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
at java.awt.Container.preferredSize(Unknown Source)
at java.awt.Container.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
好烦啊,求求各位好心的哥哥姐姐帮忙解决下
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class GameFrame extends JFrame{ int[] ta = new int[6];
JTable bill;
JScrollPane pn = new JScrollPane(bill); public GameFrame(){
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setLayout(null);
bill = new JTable(fun(ta)){
public boolean isCellEditable(int rowIndex, int columnIndex){
return false; //设置单元格不可编辑
}
};
pn.setBounds(100, 100, 600, 400);
this.add(pn);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
new Thread(new BillThread()).start();
} private class BillThread implements Runnable{
public void run() {
while(true){
bill.setModel(fun(ta));
pn.getViewport().add(bill,null);
pn.revalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<6;i++)
ta[i] += 1;
}
}
} private DefaultTableModel fun(int[] a){
Object[] billTitle = {"标题1","标题2","标题3"}; //定义标题
Object[][] billTable = {
{a[0],a[1],a[2]},
{a[3],a[4],a[5]}
};
DefaultTableModel model;
model = new DefaultTableModel(billTable,billTitle);
return model;
}
public static void main(String[] args) {
new GameFrame();
}}我需要做个表格,然后每1秒刷新一次,
为什么运行几秒后报错啊
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
at java.awt.Container.preferredSize(Unknown Source)
at java.awt.Container.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
好烦啊,求求各位好心的哥哥姐姐帮忙解决下
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.JComponent._paintImmediately(JComponent.java:5087)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
public void run() {
while(true){
bill.setModel(fun(ta));
pn.getViewport().add(bill,null);
pn.revalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<6;i++)
ta[i] += 1;
}
}
}这个方法 继承改下
private class BillThread extends Thread {
public void run() {
while (true) {
bill.setModel(fun(ta));
pn.getViewport().add(bill, null);
pn.revalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 6; i++)
ta[i] += 1;
}
}
}
(ccc)一样还是报错
就是不知怎么解决这个问题。
while (true) {
bill.setModel(fun(ta));
pn.getViewport().add(bill, null);
pn.revalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 6; i++)
ta[i] += 1;
pn.remove(bill);
}
}
试试
听说这个是Swing自己在绘制表格时报的错
你将表格的数据改变,然后fire事件通知swing; swing会在Thread中绘制.
但是Swing是线程不安全的.这个错误很可能是因为你在不安全的地方操作了Table的数据.
package test.problem;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;import javax.swing.*;public class GameFrame extends JFrame {
private static final long serialVersionUID = 1L;
JLabel bill;
List<JLabel> list = new ArrayList<JLabel>(); public GameFrame() {
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());
for (int i = 0; i < 6; i++) {
bill = new JLabel();
this.add(bill);
list.add(bill);
}
JButton b = new JButton("start");
this.add(b);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
b.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
new BillThread(list).start();
}
}); } class BillThread extends Thread {
private List<JLabel> l = null; public BillThread(List<JLabel> list) {
this.l = list;
} public void run() {
int i = 0;
while (true) {
try {
for (JLabel jl : l)
jl.setText(i + "");
i++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public static void main(String[] args) {
new GameFrame();
}}
下面这个是给你改的还是用JTable,没有简化为JLabel,应该是没有问题了
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;public class GameFrame extends JFrame{ int[] ta = new int[6];
JTable bill;
JScrollPane pn = new JScrollPane(bill); private Timer timer=null;//added by ioe_gaoyong private class TableListener implements ActionListener { @Override
public void actionPerformed(ActionEvent e) {
//To change body of implemented methods use File | Settings | File Templates.
bill.setModel(fun(ta));
pn.getViewport().add(bill,null);
pn.revalidate();
for(int i=0;i<6;i++)
ta[i] += 1;
}
} public GameFrame(){
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setLayout(null);
bill = new JTable(fun(ta)){
public boolean isCellEditable(int rowIndex, int columnIndex){
return false; //设置单元格不可编辑
}
};
pn.setBounds(100, 100, 600, 400);
this.add(pn);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true); timer=new Timer(1000,new TableListener());
timer.start();
}// private class BillThread implements Runnable{
// public void run() {
// while(true){
// bill.setModel(fun(ta));
// pn.getViewport().add(bill,null);
// pn.revalidate();
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// for(int i=0;i<6;i++)
// ta[i] += 1;
// }
// }
// } private DefaultTableModel fun(int[] a){
Object[] billTitle = {"标题1","标题2","标题3"}; //定义标题
Object[][] billTable = {
{a[0],a[1],a[2]},
{a[3],a[4],a[5]}
};
DefaultTableModel model;
model = new DefaultTableModel(billTable,billTitle);
return model;
} public static void main(String[] args) {
new GameFrame();
}}
Swing是线程安全的,你用不安全的Timer去控制安全的组件,你说结果是否是安全的呢?