我想做一个动态歌曲列表,表示为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();
}
这就是我得到的
我想要的是,左侧面板将显示多个PanelItem's
答案 0 :(得分:5)
我想猜(因为这是我们目前所能做的)你的问题是你的容器JPanel,songListPanel,你给它一个GroupLayout或其他不容易接受新组件的布局你试图给它。
但话虽如此,我认为更好的解决方案是在GUI的左侧使用JList,因为它似乎是为您正在尝试的内容而构建的。
请详细了解JList Tutorial。
作为我正在谈论的一个例子...
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();
}
});
}
}