【问题标题】:Swing how to close JPanel programmaticallySwing如何以编程方式关闭JPanel
【发布时间】:2015-01-01 22:44:20
【问题描述】:

我的主类扩展了 JPanel,我在这个面板上创建了一个表格和一个按钮。现在我想在用户按下它时关闭这个面板。在互联网上关闭示例是关于 JFrame。有 JPanel 的解决方案吗?

  • 有一个面板
  • 面板上有一个表格和一个按钮
  • 我为按钮添加了一个动作监听器
  • 如果用户按下按钮,我想关闭面板
  • 这是我现在想要的代码,当用户按下 btnDelete 然后它关闭面板时

    公共类 ListUsers 扩展 JPanel {

    结果集 rs; 客户DAO dao; JScrollPane 滚动窗格; JTable表; 对象列 ID;

    public ListUsers() 抛出 SQLException {

    dao = new ClientDAO();
    rs=dao.getUsers();
    ResultSetMetaData md = rs.getMetaData();  
    int columnCount = md.getColumnCount();  
    
    Vector<String> columns = new Vector(columnCount);  
    
    //store column names  
    for(int i=1; i<=columnCount; i++)  
        columns.add(md.getColumnName(i));  
    
    Vector data = new Vector();  
    Vector row;  
    
    //store row data  
    while(rs.next())  
    {  
        row = new Vector(columnCount);  
        for(int i=1; i<=columnCount; i++)  
        {  
            row.add(rs.getString(i));  
        }  
        data.add(row);  
    }  
    
    
    
    
    
    table = new JTable(data, columns);  
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));  
    table.setFillsViewportHeight(true);  
    table.setVisible(true);  
    table.validate();
    table.setEnabled(true);
    add(table);
    
    
    
    
    table.addMouseListener(new MouseAdapter() {
           public void mouseClicked(MouseEvent e) {
    
    
    
    
    
               final JDialog dialog = new JDialog();
               dialog.setSize(300, 200);
               dialog.setLayout(null);
    
    
               columnId = table.getValueAt(table.getSelectedRow(),0);
    
               Integer no = new Integer(columnId.toString());
               final int i =no.intValue();
    
               String columnNo =columnId.toString();
               String name = table.getValueAt(table.getSelectedRow(),1).toString();
               String surname = table.getValueAt(table.getSelectedRow(),2).toString();
               String gender = table.getValueAt(table.getSelectedRow(),3).toString();
    
    
               String labelText ="<html>Name :<b>"+name+"</b><br>Surname :<b>"+surname+"</b><br>Gender :<b>"+gender+"</b></html>";
               JLabel label=new JLabel(labelText);
               label.setVisible(true);
               label.setBounds(10,  10,300, 100);
               dialog.add(label);
    
    
    
               JButton btnUpdate= new JButton("Update");
               btnUpdate.setVisible(true);
               btnUpdate.setBounds(10,100,100,35);
    
    
               JButton    btnDelete= new JButton("Delete");
               btnDelete.setVisible(true);
               btnDelete.setBounds(150,100,100,35);
    
    
    
    
               dialog.add(btnDelete);
               dialog.add(btnUpdate);
    
    
               btnUpdate.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    dialog.setVisible(false);
    
                }
            });
    
    
               btnDelete.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
    
    
    
                    try {
                        dao.deleteUser(i);
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    dialog.setVisible(false);
    
    
                    setVisible(false);
                    System.exit(0);
    
    
    
                }
            });
    
               dialog.setVisible(true);
    

【问题讨论】:

  • 你可以隐藏它。 setVisible(false)
  • 我 setVisible(false) 但是面板仍然可见,只是面板上的项目消失了。
  • 也许您应该向我们提供一些产生问题的代码。编辑您的问题并将其添加到那里。没有更多细节,很难进一步提供帮助。
  • 另外,您要处理面板吗?你要在同样的状态下再次打开它吗?
  • 我的 ide 无法识别 dispose()

标签: java swing


【解决方案1】:

如果你想“关闭”一个 JPanel,你可以隐藏它。

myPanel.setVisible(false);

如果/当你想再次“打开”它时:

myPanel.setVisible(true);

【讨论】:

  • 在这种情况下,面板将继续在后台运行。
【解决方案2】:
public void actionPerformed(ActionEvent e) {
  JComponent comp = (JComponent) e.getSource();
  Window win = SwingUtilities.getWindowAncestor(comp);
  win.dispose();
}

e.getSource():获取JavaComponent

getWindowAncestor:返回Component的第一个Window 祖先

win.dispose(): 释放此使用的所有本机屏幕资源 它的子组件,以及它所有的子组件。

【讨论】:

  • 请补充说明。
  • 给你!已添加!
【解决方案3】:

假设您想在按下按钮时关闭 Swing 应用程序。您可以使用:

System.exit(0);

【讨论】:

  • @Harunergül 如果它不适合你,你为什么选择这个答案是正确的。
【解决方案4】:

您可以尝试再次使用Frame.pack(),它对我有用。

【讨论】:

  • 或尝试以下方法之一: setOpaque(false);设置启用(假);设置可见(假); removeAll();
  • 希望对某人有所帮助,当时对我很有用
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 2015-11-26
  • 2020-07-08
  • 2013-07-04
  • 2010-11-17
  • 2016-03-08
  • 1970-01-01
相关资源
最近更新 更多