Java JTable仅在调用GUI()的新实例时刷新;
我有一个简单的JTable应用程序,只有在buttonListener方法中使用“new GUI()”时才能添加数据。否则就不行了。我试过使用每一个火炉台。。。方法在该代码中的每个位置。还尝试了mainFrame/mainPanel.repaint();表.重新验证() 主类Java JTable仅在调用GUI()的新实例时刷新;,java,swing,user-interface,jtable,refresh,Java,Swing,User Interface,Jtable,Refresh,我有一个简单的JTable应用程序,只有在buttonListener方法中使用“new GUI()”时才能添加数据。否则就不行了。我试过使用每一个火炉台。。。方法在该代码中的每个位置。还尝试了mainFrame/mainPanel.repaint();表.重新验证() 主类 public class AddressBook { public static void main(String[] args) { try { UIManager.setLookA
public class AddressBook {
public static void main(String[] args) {
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
new GUI();
}
catch(Exception e){
System.out.println("GUI loading error..");
}
}
}
GUI()类
MyTableModel类
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
static private ArrayList<Person> personList = new ArrayList<Person>();
Object[][] persons = new Object[personList.size()][4];
int row;
int col;
static String name;
static String surname;
String email;
static int telephone;
private String[] columnNames = {"First Name",
"Last Name",
"E-mail",
"Telephone"};
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public int getRowCount() {
return persons.length;
}
@Override
public Object getValueAt(int row, int col) {
for(int i=0; i<personList.size(); i++) {
persons [i][0] = personList.get(i).name.toString();
persons [i][1] = personList.get(i).surname.toString();
persons [i][2] = personList.get(i).mail.toString();
persons [i][3] = personList.get(i).telephone;
}
return persons[row][col];
}
public void fire(Object value, int row, int col) {
persons[row][col] = value;
}
public void setValueAt(String n, String s, String e, int t){
name = n;
surname = s;
email = e;
telephone = t;
Person person = new Person(n, s, e, t);
personList.add(person);
}
}
您的表格模型已损坏:
- 在ArrayList和2D数组中都有奇怪的数据复制。完全摆脱2D对象数组,只需使用ArrayList,这是一个应该是静态的字段
- 您需要给这个类一个
方法,并在该方法中向ArrayList添加另一个人,并调用addRow(personp)
方法,传递正确的数据。这是应该从AddActionListener调用的方法fireTableRowsInserted(…)
- 或者让自己更轻松,根本不使用ArrayList,而是扩展DefaultTableModel并使用其方法。这将是如此简单和容易,这是我会做的
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.*;
public class TableFun extends JPanel {
public static final String[] COL_NAMES = { "First Name", "Last Name", "E-mail", "Telephone" };
private MyTableModel2 model = new MyTableModel2(COL_NAMES);
private JTable myTable = new JTable(model);
public TableFun() {
JButton addPersonBtn = new JButton(new AddPersonAction("Add Person"));
JPanel btnPanel = new JPanel();
btnPanel.add(addPersonBtn);
setLayout(new BorderLayout());
add(new JScrollPane(myTable));
add(btnPanel, BorderLayout.PAGE_END);
}
private class AddPersonAction extends AbstractAction {
public AddPersonAction(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
String name = "John";
String surname = "Smith";
String address = "Foo Street";
String telephone = "222-222-5555";
model.addRow(new Person(name, surname, address, telephone));
}
}
private static void createAndShowGui() {
TableFun mainPanel = new TableFun();
JFrame frame = new JFrame("Table Fun");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private class MyTableModel2 extends DefaultTableModel {
public MyTableModel2(String[] columnNames) {
super(columnNames, 0);
}
public void addRow(Person person) {
Object[] rowData = new Object[4];
rowData[0] = person.getName();
rowData[1] = person.getSurname();
rowData[2] = person.getMail();
rowData[3] = person.getTelephone();
super.addRow(rowData);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (getRowCount() > 0) {
Object value = getValueAt(0, columnIndex);
if (value != null) {
return value.getClass();
}
}
return super.getColumnClass(columnIndex);
}
}
}
class Person {
private String name;
private String surname;
private String mail;
private String telephone;
public Person(String n, String s, String m, String t) {
name = n;
surname = s;
mail = m;
telephone = t;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
public String getMail() {
return mail;
}
public String getTelephone() {
return telephone;
}
}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
导入javax.swing.table.*;
公共类TableFun扩展了JPanel{
公共静态最终字符串[]COL_NAMES={“First Name”、“Last Name”、“E-mail”、“Telephone”};
私有MyTableModel2模型=新的MyTableModel2(列名称);
私有JTable myTable=新JTable(模型);
公共桌游({
JButton addPersonBtn=newjbutton(newaddpersonAction(“addperson”));
JPanel btnPanel=新的JPanel();
添加(addPersonBtn);
setLayout(新的BorderLayout());
添加(新的JScrollPane(myTable));
添加(btnPanel,BorderLayout.PAGE_END);
}
私有类AddPersonAction扩展了AbstractAction{
public AddPersonAction(字符串名称){
超级(姓名);
}
@凌驾
已执行的公共无效操作(操作事件e){
字符串name=“John”;
字符串姓氏=“史密斯”;
字符串地址=“富街”;
字符串电话=“222-222-5555”;
addRow(新人(姓名、姓氏、地址、电话));
}
}
私有静态void createAndShowGui(){
TableFun主面板=新建TableFun();
JFrame=新JFrame(“桌上乐趣”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
私有类MyTableModel2扩展了DefaultTableModel{
公共MyTableModel2(字符串[]列名称){
超级(列名称,0);
}
公共无效添加行(人){
对象[]行数据=新对象[4];
rowData[0]=person.getName();
rowData[1]=person.getnam姓氏();
rowData[2]=person.getMail();
rowData[3]=person.getTelephone();
super.addRow(rowData);
}
@凌驾
公共类getColumnClass(int columnIndex){
如果(getRowCount()>0){
对象值=getValueAt(0,columnIndex);
if(值!=null){
返回值。getClass();
}
}
返回super.getColumnClass(columnIndex);
}
}
}
班主任{
私有字符串名称;
私家姓;
私人字符串邮件;
专用串电话;
公众人物(n串、s串、m串、t串){
name=n;
姓氏=s;
邮件=m;
电话=t;
}
公共字符串getName(){
返回名称;
}
公共字符串getNames(){
返回姓氏;
}
公共字符串getMail(){
回信;
}
公共字符串getTelephone(){
回电;
}
}
请注意,如果您按照建议消除代码的混乱,您自己的代码也可以工作:
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private ArrayList<Person1> personList = new ArrayList<Person1>();
private String[] columnNames = { "First Name", "Last Name", "E-mail", "Telephone" };
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public int getRowCount() {
return personList.size(); //!!
}
@Override
public Object getValueAt(int row, int col) {
Person1 person = personList.get(row);
switch (col) {
case 0:
return person.name;
case 1:
return person.surname;
case 2:
return person.mail;
case 3:
return person.telephone;
}
return "";
}
public void setValueAt(String n, String s, String e, int t) {
Person1 person = new Person1(n, s, e, t);
personList.add(person);
int firstRow = personList.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}
}
类MyTableModel扩展了AbstractTableModel{
私有静态最终长serialVersionUID=1L;
private ArrayList personList=new ArrayList();
私有字符串[]columnNames={“名字”、“姓氏”、“电子邮件”、“电话”};
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
public int getRowCount(){
返回personList.size();/!!
}
@凌驾
公共对象getValueAt(整数行,整数列){
Person1 person=personList.get(行);
开关(col){
案例0:
返回person.name;
案例1:
返回人。姓氏;
案例2:
返回person.mail;
案例3:
回信人电话;
}
返回“”;
}
public void setValueAt(字符串n、字符串s、字符串e、int t){
人员1人员=新人员1(n、s、e、t);
personList.add(person);
int firstRow=personList.size()-1;
int lastRow=第一行;
fireTableRowsInserted(第一排,最后一排);
}
}
请参见编辑以回答问题
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.*;
public class TableFun extends JPanel {
public static final String[] COL_NAMES = { "First Name", "Last Name", "E-mail", "Telephone" };
private MyTableModel2 model = new MyTableModel2(COL_NAMES);
private JTable myTable = new JTable(model);
public TableFun() {
JButton addPersonBtn = new JButton(new AddPersonAction("Add Person"));
JPanel btnPanel = new JPanel();
btnPanel.add(addPersonBtn);
setLayout(new BorderLayout());
add(new JScrollPane(myTable));
add(btnPanel, BorderLayout.PAGE_END);
}
private class AddPersonAction extends AbstractAction {
public AddPersonAction(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
String name = "John";
String surname = "Smith";
String address = "Foo Street";
String telephone = "222-222-5555";
model.addRow(new Person(name, surname, address, telephone));
}
}
private static void createAndShowGui() {
TableFun mainPanel = new TableFun();
JFrame frame = new JFrame("Table Fun");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private class MyTableModel2 extends DefaultTableModel {
public MyTableModel2(String[] columnNames) {
super(columnNames, 0);
}
public void addRow(Person person) {
Object[] rowData = new Object[4];
rowData[0] = person.getName();
rowData[1] = person.getSurname();
rowData[2] = person.getMail();
rowData[3] = person.getTelephone();
super.addRow(rowData);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (getRowCount() > 0) {
Object value = getValueAt(0, columnIndex);
if (value != null) {
return value.getClass();
}
}
return super.getColumnClass(columnIndex);
}
}
}
class Person {
private String name;
private String surname;
private String mail;
private String telephone;
public Person(String n, String s, String m, String t) {
name = n;
surname = s;
mail = m;
telephone = t;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
public String getMail() {
return mail;
}
public String getTelephone() {
return telephone;
}
}
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private ArrayList<Person1> personList = new ArrayList<Person1>();
private String[] columnNames = { "First Name", "Last Name", "E-mail", "Telephone" };
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public int getRowCount() {
return personList.size(); //!!
}
@Override
public Object getValueAt(int row, int col) {
Person1 person = personList.get(row);
switch (col) {
case 0:
return person.name;
case 1:
return person.surname;
case 2:
return person.mail;
case 3:
return person.telephone;
}
return "";
}
public void setValueAt(String n, String s, String e, int t) {
Person1 person = new Person1(n, s, e, t);
personList.add(person);
int firstRow = personList.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}
}