无法刷新JFrame / JSsrollPane

时间:2015-05-18 19:39:49

标签: java jframe jscrollpane

此代码用于从我们在jtextfield中输入的xml文件中获取特定数据,直到它第一次正常运行,就像它在图像中显示的那样,但问题在我们想要搜索其他数据时开始,I获取数据(我已经测试过了)但我无法刷新表中的值 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>

如果有人可以帮助我

2 个答案:

答案 0 :(得分:0)

最简单的解决方案是在initialize()方法中创建滚动窗格(就像您已注释掉的代码一样)。

然后,当您想要更新滚动窗格中的组件时,只需使用:

List<TreeItem> treeItems = Arrays.asList( m_viewer.getTree().getItems() );
int index = treeItems.indexOf( element );

if( index % 2 == 0 )
        {
            backgroundColor = Display.getDefault().getSystemColor(
                    SWT.COLOR_YELLOW );
        }
        else
        {
            backgroundColor = Display.getDefault().getSystemColor(
                    SWT.COLOR_GRAY );
        }

无需revalidate(),repaint()或其他任何内容。

答案 1 :(得分:0)

修改后的代码(感谢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;
    }

}
}