表没有添加到Action上的面板

时间:2014-01-13 10:58:29

标签: java jtable action

我有Jtable,我想在触发MenuItem时添加到主JFrame,但问题是不会显示。

如果我从一开始就将表格添加到面板中,但我需要它来显示动作发生的时间。

这是创建框架的主要类(我删除了几个不需要发布的项目,如创建菜单栏,菜单等):

package gestiune;
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.*;

public class Gestiune {
    static Gest gest;
    static Action actListaAng;    
    static JPanel panouPrinc;
    static ListaAngajati lang;
    static JMenuItem listaAng;
    static class Gest extends JFrame{
     public Gest(){                
            actListaAng = new ActListaAng("List");
            listaAng=new JMenuItem(actListaAng);
            panouPrinc = new JPanel();
            panouPrinc.setBackground(Color.white);
            Container cp = getContentPane();            
            cp.add(panouPrinc);
            pack();
            setTitle("Some title");
            setSize(1000,700);
            setLocation(0,0);
            setVisible(true);            
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
    }        

    public static void main(String[] args) {
        gest = new Gest();
    }

    //class for listing action
    static class ActListaAng extends AbstractAction {

        public ActListaAng(String text){
            super(text);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            lang = new ListaAngajati();
            panouPrinc.add(lang);
        }
    }
}

这是表类:

package gestiune;
import javax.swing.*;
import java.awt.*;

public class ListaAngajati extends JPanel {
    JTable tabel;
    JScrollPane panouScroll;
    public ListaAngajati() {
        panouScroll = new JScrollPane(tabel);
        String[] numeCol = {
        "Nume",
        "Prenume",
        "Categorie",
        "Data Adaugare",
        "Ultima Modificare"
    };

    Object[][] linii = {
        {"verban","adrian","sds","16-03-1989","acum"}
    };    
    tabel = new JTable(linii,numeCol);
    setLayout(new BorderLayout());
    add(tabel.getTableHeader(), BorderLayout.PAGE_START);
    add(panouScroll);
    add(tabel);

    }    

}

我尝试了几件事,比如在ActionEvent上使用重绘,或者直接进入表类......而如果我将lang=new ListaAngajati(); panouPrinc.add(lang);直接添加到主jframe构造函数中,那么从动作开始没有,所以我有点选择,所以有人能帮我一把吗?

3 个答案:

答案 0 :(得分:1)

如果您revalidate()repaint()有效。在运行时添加组件后,您应始终revalidate()repaint()

@Override
public void actionPerformed(ActionEvent e){
    lang=new ListaAngajati();
    panouPrinc.add(lang);
    panouPrinc.revalidate();
    panouPrinc.repaint();
}

此外没有按钮可点击,所以我在这里添加了一个按钮,并添加了动作

Container cp=getContentPane(); 
JButton button = new JButton(new ActListaAng("Action"));
button.setText("Open");
cp.add(button, BorderLayout.PAGE_START);
cp.add(panouPrinc);
pack();

工作正常。


作为旁注,您确实需要阅读static上的教程。你完全不必要地使用它。

答案 1 :(得分:1)

调用updateUI()或repaint()或revalidate();因为添加了表但UI没有刷新。

答案 2 :(得分:1)

//全球宣言

private Vector<Vector<String>> data; //used for data from database
private Vector<String> header; //used to store data header
private int count=0;

//仅在表单加载

上显示标题
//create header for the table
header = new Vector<String>();
header.add("Column1"); 
header.add("Column2");
...
model=new DefaultTableModel(data,header);
table = new JTable(model);

//在actionPerformed()

public void actionPerformed(ActionEvent ae){
    if(ae.getSource()==yourMenuItem){
data=get();

        for(int i=0;i<count;i++){
        Object[] d={data.get(i).get(0),data.get(i).get(1),data.get(i).get(2)};
        model.addRow(d);
}
}
    }

这将帮助您从数据库中获取数据

get(){
Vector<Vector<String>> doublevector = new Vector<Vector<String>>();

Connection conn = dbConnection();//Your Database connection code
PreparedStatement pre1 = conn.prepareStatement("select * from Table");

ResultSet rs1 = pre1.executeQuery();
while(rs1.next())
{
Vector<String> singlevector = new Vector<String>();
singlevector.add(rs1.getString(1)); 
singlevector.add(rs1.getString(2)); 
....
doublevector.add(singlevector);
count++
}

return doublevector;
}