Selection of among multiple JInternalFrames in a container(JPanel)

前端 未结 1 372
别那么骄傲
别那么骄傲 2021-01-27 17:50

I have some set of JInternalFrame in a Jpanel. and the JPanel is gridlayout. I need to set only one JInternalFrame to be sele

相关标签:
1条回答
  • 2021-01-27 18:03

    As suggested in How to Use Internal Frames, "Usually, you add internal frames to a desktop pane." This allows you to use activateFrame() to indicate that a frame has focus. In this example, a javax.swing.Action is used to select frames from a menu via setSelected(). Additional discussion may be found in this Q&A.

    Addendum: If you want to use a JPanel, perhaps to get a nice GridLayout, one aproach is to use an InternalFrameListener as shown below.

    enter image description here

    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.beans.PropertyVetoException;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.event.InternalFrameAdapter;
    import javax.swing.event.InternalFrameEvent;
    
    /** @see https://stackoverflow.com/questions/8389640 */
    public class InternalGrid extends JPanel {
    
        private final List<MyFrame> list = new ArrayList<MyFrame>();
    
        public InternalGrid() {
            super(new GridLayout(2, 2));
            for (int i = 0; i < 4; i++) {
                MyFrame f = new MyFrame("Frame", i);
                list.add(f);
                this.add(f);
            }
        }
    
        private void display() {
            JFrame f = new JFrame("InternalGrid");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setSize(320, 240);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new InternalGrid().display();
                }
            });
        }
    
        class MyFrame extends JInternalFrame {
    
            MyFrame(String name, int i) {
                super(name + String.valueOf(i), true, true, true, false);
                this.pack();
                this.setVisible(true);
                this.setLayout(new FlowLayout());
                this.add(new JLabel("Hi, I'm " + this.getTitle()));
                this.addInternalFrameListener(new InternalFrameAdapter() {
    
                    @Override
                    public void internalFrameActivated(InternalFrameEvent e) {
                        for (MyFrame f : list) {
                            if (f != MyFrame.this) {
                                try {
                                    f.setSelected(false);
                                } catch (PropertyVetoException ex) {
                                    System.out.println(ex);
                                }
                            }
                        }
                    }
                });
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题