Показать java JPanel в JFrame - PullRequest
2 голосов
/ 19 марта 2011

У меня проблемы с отображением моей JPanel. Я хочу использовать различные расширенные JPanels для отображения того, что я хочу, чтобы пользователь делал с этой программой (которая в конечном итоге предназначена для отображения фотографий). Ниже приведен код только двух классов, существующих на данный момент. К сожалению, у меня проблемы с тем, чтобы заставить это работать прямо из ворот с первой панелью, которая должна была предоставить пользователю возможность выбирать различные графические изображения.

Что происходит, я не могу отобразить свою JPanel, пока не нажму пункт «Открыть» в меню «Файл». Как только этот JOptionPane показывает, мой JPanel (NewAlbum) тоже показывает.

class PhotoGallery {
    static JPanel transientPanel = null;
    static final JFrame mainFrame = new JFrame("Photo Gallery");

    public static void main(String[] args) {
        JMenu fileMenu = new JMenu("File");
        fileMenu.setMnemonic(KeyEvent.VK_F);

        JMenuItem open = new JMenuItem("Open");
        open.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(mainFrame, "Hello World");
            }
        });
        fileMenu.add(open);

        JMenuItem newAlbum = new JMenuItem("New Album");
        open.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                AssignToTransientPanel((JPanel) new NewAlbum());
                Container content = mainFrame.getContentPane();
                content.removeAll();
                content.add(transientPanel);
                content.validate();
                content.repaint();
            }
       });
       fileMenu.add(newAlbum);

       JMenuItem exit = new JMenuItem("Exit");
       exit.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
               System.exit(0);
           }
       });
       fileMenu.add(exit);

       JMenuBar pgMenu = new JMenuBar();
       pgMenu.add(fileMenu);
       mainFrame.setJMenuBar(pgMenu);
       mainFrame.setSize(640, 480);
       mainFrame.setLocation(20, 45);

       mainFrame.validate();
       mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       mainFrame.setVisible(true);
   }

    public static void AssignToTransientPanel(JPanel jp) {
        if(transientPanel != null)
            mainFrame.remove(transientPanel);
            transientPanel = jp;
        }
    }
}

class NewAlbum extends JPanel {
    JButton selectImages = new JButton("Select Images");
    JFileChooser jfc;
    File[] selectedFiles;

    public NewAlbum() {
        selectImages.setLocation(25, 25);
        add(selectImages);

        selectImages.addActionListener(new ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent ae) {
             jfc = new JFileChooser();
             jfc.setMultiSelectionEnabled(true);
             jfc.showOpenDialog(getParent());
             selectedFiles = jfc.getSelectedFiles();
         }
      });

      this.validate();
   }

   public int getHeight() {
       return getParent().getSize().height - 20;
   }

   public int getWidth() {
       return getParent().getSize().width - 20;
   }

   public Dimension getPreferredSize() {
       return new Dimension(this.getWidth(), this.getHeight());
   }

}

1 Ответ

5 голосов
/ 19 марта 2011

Вы не добавили никаких компонентов на панель содержимого mainFrame в методе main. Единственный раз, когда панель добавляется в этом ActionListener:

    open.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            AssignToTransientPanel((JPanel) new NewAlbum());
            Container content = mainFrame.getContentPane();
            content.removeAll();
            content.add(transientPanel);
            content.validate();
            content.repaint();
        }
   });

Это вызывается только при нажатии кнопки «Открыть», поскольку вы, я полагаю, случайно добавили ActionListener в открытый JMenuItem, а не в newAlbum JMenuItem. Чтобы добавить контент при запуске, вы должны добавить что-то подобное перед строкой mainFrame.setVisible (true):

mainFrame.add(new NewAlbum());

Кстати, все исходные коды Java должны начинаться со строчной буквы. assignToTransientPanel будет лучшим именем для вашего метода.

...