无法刷新 JFrame/JSsrollPane
Can't Refresh a JFrame/JSsrollPane
此代码用于从我们在 jtextfield 中输入的 xml 文件中获取特定数据,直到它第一次运行良好,就像它在图像中显示的那样,但是当我们想要时,问题就开始了搜索另一个数据,我得到了数据(我已经测试过了)但是我无法刷新 table 中的值
the image of the result
package gui;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.JMenuBar;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Frame1 {
private JFrame frame;
private JTextField searchField;
int i=0;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame1 window = new Frame1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* parse Data
*/
private JTable parseData(String st){
JTable table = null;
List<String> columns = new ArrayList<String>();
List<String[]> values = new ArrayList<String[]>();
columns.add("Word");
columns.add("Lemma");
columns.add("monosylables");
columns.add("Arabic");
try{
File fXmlFile = new File("src/gui/TAL.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("word");
for (int temp = 0; temp < nList.getLength(); temp++) {
if(nList.item(temp).getTextContent().equals(st)){
Node nNode = nList.item(temp).getParentNode();
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
//System.out.println("Staff id : " + eElement.getAttribute("id"));
//System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
//System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
//System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
//System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
values.add(new String[]{eElement.getElementsByTagName("word").item(0).getTextContent(),
eElement.getElementsByTagName("lemma").item(0).getTextContent(),
eElement.getElementsByTagName("monosylables").item(0).getTextContent(),
eElement.getElementsByTagName("arabic").item(0).getTextContent()});
TableModel tableModel = new DefaultTableModel(values.toArray(new Object[][] {}), columns.toArray());
table = new JTable(tableModel);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* Create the application.
*/
public Frame1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
searchField = new JTextField();
searchField.addActionListener(new SearchActionListener());
frame.getContentPane().add(searchField, BorderLayout.NORTH);
//frame.getContentPane().add(scrollPane,BorderLayout.CENTER);
searchField.setColumns(10);
}
class SearchDocumentListener implements DocumentListener{
@Override
public void changedUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void insertUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void removeUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
}
class SearchActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String st=searchField.getText();
JTable table=parseData(st);
if(table!=null){
int selectedRowIndex = table.getSelectedRow();
int selectedColumnIndex = table.getSelectedColumn();
String selectedObject = (String) table.getModel().getValueAt(0, 1);
System.out.println(selectedObject);
}
//JScrollPane scrollPane;
//scrollPane = new JScrollPane(table);//
frame.getContentPane().add(table,BorderLayout.CENTER);
frame.revalidate();
frame.repaint();
i=i+1;
}
}
}
我使用的 xml 文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<dictionary>
<work>
<word>kaleb</word>
<lemma>kalbon</lemma>
<monosylables>kal,eb</monosylables>
<arabic>كلب</arabic>
</work>
<work>
<word>emchi</word>
<lemma>Amchi</lemma>
<monosylables>em,chi</monosylables>
<arabic>إمشي</arabic>
</work>
</dictionary>
如果有人能帮助我,请多多指教
最简单的解决方案是在 initialize() 方法中创建滚动窗格(就像您注释掉的代码一样)。
然后当你想更新滚动窗格中的组件时,你只需使用:
scrollPane.setViewportView( table );
//frame.getContentPane().add(table,BorderLayout.CENTER);
//frame.revalidate();
//frame.repaint();
不需要 revalidate()、repaint() 或其他任何东西。
修改后的代码(感谢camickr)
package gui;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.JMenuBar;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Frame1 {
private JFrame frame;
JScrollPane scrollPane;
private JTextField searchField;
int i=0;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame1 window = new Frame1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* parse Data
*/
private JTable parseData(String st){
JTable table = null;
List<String> columns = new ArrayList<String>();
List<String[]> values = new ArrayList<String[]>();
columns.add("Word");
columns.add("Lemma");
columns.add("monosylables");
columns.add("Arabic");
try{
File fXmlFile = new File("src/gui/TAL.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("word");
for (int temp = 0; temp < nList.getLength(); temp++) {
if(nList.item(temp).getTextContent().equals(st)){
Node nNode = nList.item(temp).getParentNode();
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
//System.out.println("Staff id : " + eElement.getAttribute("id"));
//System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
//System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
//System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
//System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
values.add(new String[]{eElement.getElementsByTagName("word").item(0).getTextContent(),
eElement.getElementsByTagName("lemma").item(0).getTextContent(),
eElement.getElementsByTagName("monosylables").item(0).getTextContent(),
eElement.getElementsByTagName("arabic").item(0).getTextContent()});
TableModel tableModel = new DefaultTableModel(values.toArray(new Object[][] {}), columns.toArray());
table = new JTable(tableModel);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* Create the application.
*/
public Frame1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
scrollPane=new JScrollPane();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
searchField = new JTextField();
searchField.addActionListener(new SearchActionListener());
frame.getContentPane().add(searchField, BorderLayout.NORTH);
frame.getContentPane().add(scrollPane,BorderLayout.CENTER);
searchField.setColumns(10);
}
class SearchDocumentListener implements DocumentListener{
@Override
public void changedUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void insertUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void removeUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
}
class SearchActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String st=searchField.getText();
JTable table=parseData(st);
if(table!=null){
int selectedRowIndex = table.getSelectedRow();
int selectedColumnIndex = table.getSelectedColumn();
String selectedObject = (String) table.getModel().getValueAt(0, 1);
System.out.println(selectedObject);
}
//scrollPane = new JScrollPane(table);
scrollPane.setViewportView(table);//
//frame.getContentPane().add(scrollPane,BorderLayout.CENTER);
//frame.revalidate();
//frame.repaint();
i=i+1;
}
}
}
此代码用于从我们在 jtextfield 中输入的 xml 文件中获取特定数据,直到它第一次运行良好,就像它在图像中显示的那样,但是当我们想要时,问题就开始了搜索另一个数据,我得到了数据(我已经测试过了)但是我无法刷新 table 中的值 the image of the result
package gui;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.JMenuBar;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Frame1 {
private JFrame frame;
private JTextField searchField;
int i=0;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame1 window = new Frame1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* parse Data
*/
private JTable parseData(String st){
JTable table = null;
List<String> columns = new ArrayList<String>();
List<String[]> values = new ArrayList<String[]>();
columns.add("Word");
columns.add("Lemma");
columns.add("monosylables");
columns.add("Arabic");
try{
File fXmlFile = new File("src/gui/TAL.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("word");
for (int temp = 0; temp < nList.getLength(); temp++) {
if(nList.item(temp).getTextContent().equals(st)){
Node nNode = nList.item(temp).getParentNode();
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
//System.out.println("Staff id : " + eElement.getAttribute("id"));
//System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
//System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
//System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
//System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
values.add(new String[]{eElement.getElementsByTagName("word").item(0).getTextContent(),
eElement.getElementsByTagName("lemma").item(0).getTextContent(),
eElement.getElementsByTagName("monosylables").item(0).getTextContent(),
eElement.getElementsByTagName("arabic").item(0).getTextContent()});
TableModel tableModel = new DefaultTableModel(values.toArray(new Object[][] {}), columns.toArray());
table = new JTable(tableModel);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* Create the application.
*/
public Frame1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
searchField = new JTextField();
searchField.addActionListener(new SearchActionListener());
frame.getContentPane().add(searchField, BorderLayout.NORTH);
//frame.getContentPane().add(scrollPane,BorderLayout.CENTER);
searchField.setColumns(10);
}
class SearchDocumentListener implements DocumentListener{
@Override
public void changedUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void insertUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void removeUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
}
class SearchActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String st=searchField.getText();
JTable table=parseData(st);
if(table!=null){
int selectedRowIndex = table.getSelectedRow();
int selectedColumnIndex = table.getSelectedColumn();
String selectedObject = (String) table.getModel().getValueAt(0, 1);
System.out.println(selectedObject);
}
//JScrollPane scrollPane;
//scrollPane = new JScrollPane(table);//
frame.getContentPane().add(table,BorderLayout.CENTER);
frame.revalidate();
frame.repaint();
i=i+1;
}
}
}
我使用的 xml 文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<dictionary>
<work>
<word>kaleb</word>
<lemma>kalbon</lemma>
<monosylables>kal,eb</monosylables>
<arabic>كلب</arabic>
</work>
<work>
<word>emchi</word>
<lemma>Amchi</lemma>
<monosylables>em,chi</monosylables>
<arabic>إمشي</arabic>
</work>
</dictionary>
如果有人能帮助我,请多多指教
最简单的解决方案是在 initialize() 方法中创建滚动窗格(就像您注释掉的代码一样)。
然后当你想更新滚动窗格中的组件时,你只需使用:
scrollPane.setViewportView( table );
//frame.getContentPane().add(table,BorderLayout.CENTER);
//frame.revalidate();
//frame.repaint();
不需要 revalidate()、repaint() 或其他任何东西。
修改后的代码(感谢camickr)
package gui;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.JMenuBar;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Frame1 {
private JFrame frame;
JScrollPane scrollPane;
private JTextField searchField;
int i=0;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame1 window = new Frame1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* parse Data
*/
private JTable parseData(String st){
JTable table = null;
List<String> columns = new ArrayList<String>();
List<String[]> values = new ArrayList<String[]>();
columns.add("Word");
columns.add("Lemma");
columns.add("monosylables");
columns.add("Arabic");
try{
File fXmlFile = new File("src/gui/TAL.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("word");
for (int temp = 0; temp < nList.getLength(); temp++) {
if(nList.item(temp).getTextContent().equals(st)){
Node nNode = nList.item(temp).getParentNode();
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
//System.out.println("Staff id : " + eElement.getAttribute("id"));
//System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
//System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
//System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
//System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
values.add(new String[]{eElement.getElementsByTagName("word").item(0).getTextContent(),
eElement.getElementsByTagName("lemma").item(0).getTextContent(),
eElement.getElementsByTagName("monosylables").item(0).getTextContent(),
eElement.getElementsByTagName("arabic").item(0).getTextContent()});
TableModel tableModel = new DefaultTableModel(values.toArray(new Object[][] {}), columns.toArray());
table = new JTable(tableModel);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* Create the application.
*/
public Frame1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
scrollPane=new JScrollPane();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
searchField = new JTextField();
searchField.addActionListener(new SearchActionListener());
frame.getContentPane().add(searchField, BorderLayout.NORTH);
frame.getContentPane().add(scrollPane,BorderLayout.CENTER);
searchField.setColumns(10);
}
class SearchDocumentListener implements DocumentListener{
@Override
public void changedUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void insertUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void removeUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
}
class SearchActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String st=searchField.getText();
JTable table=parseData(st);
if(table!=null){
int selectedRowIndex = table.getSelectedRow();
int selectedColumnIndex = table.getSelectedColumn();
String selectedObject = (String) table.getModel().getValueAt(0, 1);
System.out.println(selectedObject);
}
//scrollPane = new JScrollPane(table);
scrollPane.setViewportView(table);//
//frame.getContentPane().add(scrollPane,BorderLayout.CENTER);
//frame.revalidate();
//frame.repaint();
i=i+1;
}
}
}