JPanel没有显示添加的组件

Ján*_*ček 1 java swing jpanel

我想做一个动态歌曲列表,表示为JPanel歌曲项目也表示为JPanel,添加到父歌曲列表JPanel

这是我的代码/ MainContext类的构造函数

public MainContext() {
        initComponents();
        PanelItem item=new PanelItem();
        songListPanel.add(item);
        item.setEnabled(true);
        item.setVisible(true);
        item.setSongLabel("bla bla");
        songListPanel.revalidate();
    }
Run Code Online (Sandbox Code Playgroud)

这就是我得到的

在此输入图像描述

我想要的是左侧面板将显示多个 PanelItem's

希望你能帮忙

Hov*_*els 5

我想猜(因为这是我们目前所能做的)你的问题是你的容器JPanel,songListPanel,你给它一个GroupLayout或其他布局,不容易接受像你这样的新组件试图给它.

但话虽如此,我认为更好的解决方案是在GUI的左侧使用JList,因为它似乎是为您正在尝试的内容而构建的.

有关详细信息,请查看JList教程.

作为我正在谈论的一个例子......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.*;

public class JListExample extends JPanel {
   private static final String PROTOTYPE_SONG = "ABCDEFGHIJKLMNOPQRS";
   private DefaultListModel<String> songListModel = new DefaultListModel<>();
   private JList<String> songList = new JList<>(songListModel);
   private JTextField songField = new JTextField(20);

   public JListExample() {
      songList.setPrototypeCellValue(PROTOTYPE_SONG);

      JPanel southPanel = new JPanel();
      southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.LINE_AXIS));
      southPanel.add(new JLabel("Song:"));
      southPanel.add(songField);
      AddSongAction songAction = new AddSongAction("Add Song");
      southPanel.add(new JButton(songAction));
      songField.setAction(songAction);

      setLayout(new BorderLayout());
      add(new JScrollPane(songList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),
            BorderLayout.LINE_START);
      add(Box.createRigidArea(new Dimension(400, 400)));
      add(southPanel, BorderLayout.PAGE_END);
   }

   private class AddSongAction extends AbstractAction {
      public AddSongAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         songListModel.addElement(songField.getText());
      }
   }

   private static void createAndShowGui() {
      JListExample mainPanel = new JListExample();

      JFrame frame = new JFrame("JListExample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
Run Code Online (Sandbox Code Playgroud)