Java 如何动态删除JPanel?

Java 如何动态删除JPanel?,java,swing,arraylist,jpanel,Java,Swing,Arraylist,Jpanel,我有一个GUI,如下所示 我想动态添加/删除面板。我使用ArrayList来跟踪JPanel对象。 现在我可以动态添加面板,但当我想删除面板时,我无法获取其属性,因此无法删除它 这是我的密码: public class Main implements ActionListener{ private List <myPanel> mpList; private JPanel btnPanel; private JButton jbtAdd,jbtDelete;

我有一个GUI,如下所示

我想动态添加/删除面板。我使用
ArrayList
来跟踪
JPanel
对象。 现在我可以动态添加面板,但当我想删除面板时,我无法获取其属性,因此无法删除它

这是我的密码:

public class Main implements ActionListener{
    private List <myPanel> mpList;
    private JPanel btnPanel;
    private JButton jbtAdd,jbtDelete;
    private JFrame jf;
    private JPanel jp;
    private JScrollPane js;
    private myPanel mp;
    private static int size=0;
    private int selectedId=-1;
    //private
    public Main(){
        mpList=new ArrayList<myPanel>();
        btnPanel=new JPanel();
        jbtAdd=new JButton("addJpanel");
        jbtDelete=new JButton("delJpanel");
        btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT,1,1));
        btnPanel.add(jbtAdd);
        btnPanel.add(jbtDelete);
        jf=new JFrame("hello");
        jp=new JPanel();
        js=new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);   
        //jp.setLayout(new FlowLayout(FlowLayout.LEFT,1,1));
        jf.setLayout(new BorderLayout(10,10));
        jp.setLayout(new GridLayout(0,1,1,1));
        jp.setPreferredSize(new Dimension(500, 82*6));
        for(int i=0;i<6;i++){
            myPanel mp=new myPanel();
            //mp.setSize(400, 82);
            //mp.setBounds(0,82*i,480,82);
            mp.getFileTypeIconLabel().setText(String.valueOf(i));
            mp.setIndexId(size);
            size++;
            mpList.add(0,mp);
            mp.addMouseListener(new MouseListener(){
                @Override
                public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                    if(2==e.getClickCount()){
                        System.out.println("indexInd is"+mpList.get(0).getIndexId());
                        //System.out.println(index);
                        mpList.get(0).setBackground(Color.yellow);
                    }
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseExited(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mousePressed(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    // TODO Auto-generated method stub

                }});
            jp.add(mpList.get(0));
        }
        js.setViewportView(jp);
        jf.setSize(600, 500);
        jf.add(btnPanel,BorderLayout.NORTH);
        jf.add(js);
        jbtAdd.addActionListener(this);
        jbtDelete.addActionListener(this);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
    public static void main(String args[]){
        new Main();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource()==jbtAdd){
            addMyPanel();
        }
        else if(e.getSource()==jbtDelete){
            delMyPanel();
        }
    }
    public void addMyPanel(){
        System.out.println("ok");
        mp=new myPanel();
        mp.getFileTypeIconLabel().setText(String.valueOf(mpList.size()));
        mp.setIndexId(size);
        System.out.println(size);
        size++;
        mpList.add(0, mp);
        mp.addMouseListener(new MouseListener(){
            @Override
            public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
                if(2==e.getClickCount()){
                    System.out.println("indexInd is"+mpList.get(0).getIndexId());
                    //System.out.println(index);
                    mpList.get(0).setBackground(Color.yellow);
                }
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }});
        jp.add(mpList.get(0));
        jp.setPreferredSize(new Dimension(500, 82*mpList.size()));
        //jp.validate();
        js.validate();
        //jp.repaint();
        js.repaint();
    }
    public void delMyPanel(){
        selectedId=getIndexOfMyPanelById();
        if(selectedId>=0){
            int indexId=getIndexOfMyPanelById();
            jp.remove(mpList.get(indexId));
            mpList.remove(indexId);
            jp.setPreferredSize(new Dimension(500,82*mpList.size()));
            jp.repaint();
        }
    }
    protected int getIndexOfMyPanelById(){
        Iterator<myPanel> it=mpList.iterator();
        for(int id=0;it.hasNext();id++){
            myPanel mp;
            mp=it.next();
            if(mp.isSelected()){
                return id;
            }
        }
        return -1;
    }
}

对于一个空间中的多个组件,请使用如图所示的

提示 见(是的。)

javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请使用布局管理器或1,以及布局填充和边框2

  • 编辑1 另一方面,屏幕截图使用自定义渲染器向我尖叫
    JList
    。例如

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    
    public class DymanicDownloadList {
    
        // the GUI as seen by the user (without frame)
        JPanel gui = new JPanel(new BorderLayout(2, 2));
    
        public void initGUI() {
            gui.setBorder(new EmptyBorder(2, 3, 2, 3));
    
            JToolBar tb = new JToolBar();
            gui.add(tb, BorderLayout.PAGE_START);
    
            final DefaultListModel<Download> listModel =
                    new DefaultListModel<Download>();
            final JList<Download> list = new JList<Download>(listModel);
            list.setCellRenderer(new DownloadListCellRenderer());
            list.setVisibleRowCount(3);
            gui.add(new JScrollPane(list), BorderLayout.CENTER);
    
            Action add = new AbstractAction("Add Download") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    listModel.addElement(new Download());
                }
            };
    
            Action delete = new AbstractAction("Delete Download") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    int index = list.getSelectedIndex();
                    if (index < 0) {
                        JOptionPane.showMessageDialog(
                                list,
                                "Select a download to delete!",
                                "Select Download",
                                JOptionPane.ERROR_MESSAGE);
                    } else {
                        listModel.removeElementAt(index);
                    }
                }
            };
    
            tb.add(add);
            tb.addSeparator();
            tb.add(delete);
    
            for (int ii = 0; ii < 2; ii++) {
                listModel.addElement(new Download());
            }
        }
    
        public JComponent getGUI() {
            return gui;
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    DymanicDownloadList ddl = new DymanicDownloadList();
                    ddl.initGUI();
    
                    JFrame f = new JFrame("Dynamic LIST");
                    f.add(ddl.getGUI());
                    // Ensures JVM closes after frame(s) closed and
                    // all non-daemon threads are finished
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    // See https://stackoverflow.com/a/7143398/418556 for demo.
                    f.setLocationByPlatform(true);
    
                    // ensures the frame is the minimum size it needs to be
                    // in order display the components within it
                    f.pack();
                    // should be done last, to avoid flickering, moving,
                    // resizing artifacts.
                    f.setVisible(true);
                }
            };
            // Swing GUIs should be created and updated on the EDT
            // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
            SwingUtilities.invokeLater(r);
        }
    }
    
    class Download {
    
        Download() {
        }
    }
    
    class DownloadListCellRenderer extends DefaultListCellRenderer {
    
        JPanel downloadPanel = new JPanel(new BorderLayout(10, 10));
        JPanel labelStack = new JPanel(new GridLayout(0, 1, 2, 2));
        JLabel number = new JLabel("", SwingConstants.CENTER);
        JLabel source = new JLabel("File Name Label", SwingConstants.CENTER);
        JLabel info = new JLabel("Download Info Label", SwingConstants.CENTER);
        JLabel free = new JLabel("Free Label", SwingConstants.CENTER);
        JProgressBar progress = new JProgressBar() {
            @Override
            public Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
    
                return new Dimension(400,d.height);
            }
        };
    
        DownloadListCellRenderer() {
            downloadPanel.add(labelStack, BorderLayout.CENTER);
            labelStack.setOpaque(false);
            number.setFont(number.getFont().deriveFont(40f));
            labelStack.add(source);
            labelStack.add(info);
            labelStack.add(progress);
            labelStack.add(free);
            downloadPanel.add(labelStack, BorderLayout.CENTER);
            downloadPanel.add(number, BorderLayout.LINE_START);
        }
    
        @Override
        public Component getListCellRendererComponent(
                JList list,
                Object value,
                int index,
                boolean isSelected,
                boolean cellHasFocus) {
            JLabel l = (JLabel) super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
            downloadPanel.setBackground(l.getBackground());
            number.setText("" + (index + 1));
    
            return downloadPanel;
        }
    }
    

    import java.awt.*;
    导入java.awt.event.ActionEvent;
    导入javax.swing.*;
    导入javax.swing.border.EmptyBorder;
    公共类DymanicDownloadList{
    //用户看到的GUI(无框架)
    jpanelgui=newjpanel(newborderlayout(2,2));
    public void initGUI(){
    setboorder(新的EmptyBorder(2,3,2,3));
    JToolBar tb=新的JToolBar();
    添加(tb,BorderLayout.PAGE_START);
    最终默认列表模型列表模型=
    新的DefaultListModel();
    最终JList列表=新JList(列表模型);
    setCellRenderer(新下载的ListCellRenderer());
    list.setVisibleRowCount(3);
    添加(新的JScrollPane(列表),BorderLayout.CENTER);
    操作添加=新的抽象操作(“添加下载”){
    @凌驾
    已执行的公共无效操作(操作事件e){
    listModel.addElement(newdownload());
    }
    };
    Action delete=新的抽象操作(“删除下载”){
    @凌驾
    已执行的公共无效操作(操作事件e){
    int index=list.getSelectedIndex();
    如果(指数<0){
    JOptionPane.showMessageDialog(
    列表
    “选择要删除的下载!”,
    “选择下载”,
    JOptionPane.ERROR\u消息);
    }否则{
    listModel.removeElementAt(索引);
    }
    }
    };
    tb.add(add);
    tb.addSeparator();
    tb.增加(删除);
    对于(int ii=0;ii<2;ii++){
    addElement(新下载());
    }
    }
    公共JComponent getGUI(){
    返回gui;
    }
    公共静态void main(字符串[]args){
    Runnable r=新的Runnable(){
    @凌驾
    公开募捐{
    DymanicDownloadList ddl=新的DymanicDownloadList();
    ddl.initGUI();
    JFrame f=新JFrame(“动态列表”);
    f、 添加(ddl.getGUI());
    //确保JVM在帧关闭后关闭,并且
    //所有非守护进程线程都已完成
    f、 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    //看https://stackoverflow.com/a/7143398/418556 用于演示。
    f、 setLocationByPlatform(真);
    //确保框架为所需的最小尺寸
    //以便显示其中的组件
    f、 包装();
    //应最后完成,以避免闪烁、移动,
    //调整工件大小。
    f、 setVisible(真);
    }
    };
    //应在EDT上创建和更新Swing GUI
    // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
    SwingUtilities.invokeLater(r);
    }
    }
    类下载{
    下载(){
    }
    }
    类DownloadListCellRenderer扩展了DefaultListCellRenderer{
    JPanel downloadPanel=新的JPanel(新的边界布局(10,10));
    JPanel labelStack=新的JPanel(新的网格布局(0,1,2,2));
    JLabel编号=新的JLabel(“,SwingConstants.CENTER);
    JLabel source=newjlabel(“文件名标签”,SwingConstants.CENTER);
    JLabel info=新的JLabel(“下载信息标签”,SwingConstants.CENTER);
    JLabel free=新的JLabel(“自由标签”,SwingConstants.CENTER);
    JProgressBar进度=新建JProgressBar(){
    @凌驾
    公共维度getPreferredSize(){
    维度d=super.getPreferredSize();
    返回新尺寸(400,d.高度);
    }
    };
    下载ListCellRenderer(){
    downloadPanel.add(labelStack,BorderLayout.CENTER);
    labelStack.设置不透明(假);
    number.setFont(number.getFont().deriveFont(40f));
    labelStack.add(来源);
    labelStack.add(信息);
    添加标签(进度);
    添加标签(免费);
    downloadPanel.add(labelStack,BorderLayout.CENTER);
    downloadPanel.add(编号、边框布局、线条开始);
    }
    @凌驾
    公共组件GetListCellRenderComponent(
    JList列表,
    对象值,
    整数索引,
    他当选了,,
    布尔单元(聚焦){
    JLabel=(JLabel)super.getListCellRenderComponent(
    列表、值、索引、isSelected、cellHasFocus);
    downloadPanel.setBackground(l.getBackground());
    number.setText(“+(索引+1));
    返回下载面板;
    }
    }
    
    对于一个空间中的多个组件,请使用如图所示的

    提示 见(是的。)

    javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请使用布局管理器或1,以及布局填充和边框2

  • 编辑1 另一方面,屏幕截图发出尖叫声
    jp.setPreferredSize(new Dimension(500, 82*6));
    
    downloadProgress.setBounds(80, 44, 400, 18);
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    
    public class DymanicDownloadList {
    
        // the GUI as seen by the user (without frame)
        JPanel gui = new JPanel(new BorderLayout(2, 2));
    
        public void initGUI() {
            gui.setBorder(new EmptyBorder(2, 3, 2, 3));
    
            JToolBar tb = new JToolBar();
            gui.add(tb, BorderLayout.PAGE_START);
    
            final DefaultListModel<Download> listModel =
                    new DefaultListModel<Download>();
            final JList<Download> list = new JList<Download>(listModel);
            list.setCellRenderer(new DownloadListCellRenderer());
            list.setVisibleRowCount(3);
            gui.add(new JScrollPane(list), BorderLayout.CENTER);
    
            Action add = new AbstractAction("Add Download") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    listModel.addElement(new Download());
                }
            };
    
            Action delete = new AbstractAction("Delete Download") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    int index = list.getSelectedIndex();
                    if (index < 0) {
                        JOptionPane.showMessageDialog(
                                list,
                                "Select a download to delete!",
                                "Select Download",
                                JOptionPane.ERROR_MESSAGE);
                    } else {
                        listModel.removeElementAt(index);
                    }
                }
            };
    
            tb.add(add);
            tb.addSeparator();
            tb.add(delete);
    
            for (int ii = 0; ii < 2; ii++) {
                listModel.addElement(new Download());
            }
        }
    
        public JComponent getGUI() {
            return gui;
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    DymanicDownloadList ddl = new DymanicDownloadList();
                    ddl.initGUI();
    
                    JFrame f = new JFrame("Dynamic LIST");
                    f.add(ddl.getGUI());
                    // Ensures JVM closes after frame(s) closed and
                    // all non-daemon threads are finished
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    // See https://stackoverflow.com/a/7143398/418556 for demo.
                    f.setLocationByPlatform(true);
    
                    // ensures the frame is the minimum size it needs to be
                    // in order display the components within it
                    f.pack();
                    // should be done last, to avoid flickering, moving,
                    // resizing artifacts.
                    f.setVisible(true);
                }
            };
            // Swing GUIs should be created and updated on the EDT
            // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
            SwingUtilities.invokeLater(r);
        }
    }
    
    class Download {
    
        Download() {
        }
    }
    
    class DownloadListCellRenderer extends DefaultListCellRenderer {
    
        JPanel downloadPanel = new JPanel(new BorderLayout(10, 10));
        JPanel labelStack = new JPanel(new GridLayout(0, 1, 2, 2));
        JLabel number = new JLabel("", SwingConstants.CENTER);
        JLabel source = new JLabel("File Name Label", SwingConstants.CENTER);
        JLabel info = new JLabel("Download Info Label", SwingConstants.CENTER);
        JLabel free = new JLabel("Free Label", SwingConstants.CENTER);
        JProgressBar progress = new JProgressBar() {
            @Override
            public Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
    
                return new Dimension(400,d.height);
            }
        };
    
        DownloadListCellRenderer() {
            downloadPanel.add(labelStack, BorderLayout.CENTER);
            labelStack.setOpaque(false);
            number.setFont(number.getFont().deriveFont(40f));
            labelStack.add(source);
            labelStack.add(info);
            labelStack.add(progress);
            labelStack.add(free);
            downloadPanel.add(labelStack, BorderLayout.CENTER);
            downloadPanel.add(number, BorderLayout.LINE_START);
        }
    
        @Override
        public Component getListCellRendererComponent(
                JList list,
                Object value,
                int index,
                boolean isSelected,
                boolean cellHasFocus) {
            JLabel l = (JLabel) super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
            downloadPanel.setBackground(l.getBackground());
            number.setText("" + (index + 1));
    
            return downloadPanel;
        }
    }