Java 有没有办法将多个JScrollPane插入到JLayeredPane中?
简言之,我试图制作一个模拟流媒体服务接口的程序来分配任务。该程序创建两个具有相同规格(大小、约束..)的单独JSCRollPane,一个用于电影,一个用于系列,每个包含一个JPanel,然后包含其他电影或系列组件。然后,我创建了一个JLayeredPane(不更改其布局),我想在其中添加两个JScrollPane作为单独的层。但是,在将JScrollPane添加到JLayeredPane并运行代码时,JLayeredPane始终显示最后添加的JScrollPane,而不考虑我在添加时设置的索引Java 有没有办法将多个JScrollPane插入到JLayeredPane中?,java,swing,user-interface,jscrollpane,jlayeredpane,Java,Swing,User Interface,Jscrollpane,Jlayeredpane,简言之,我试图制作一个模拟流媒体服务接口的程序来分配任务。该程序创建两个具有相同规格(大小、约束..)的单独JSCRollPane,一个用于电影,一个用于系列,每个包含一个JPanel,然后包含其他电影或系列组件。然后,我创建了一个JLayeredPane(不更改其布局),我想在其中添加两个JScrollPane作为单独的层。但是,在将JScrollPane添加到JLayeredPane并运行代码时,JLayeredPane始终显示最后添加的JScrollPane,而不考虑我在添加时设置的索引
//creates the movie JScrollPane
JScrollPane moviePanel = stuff.showMovies(movieLogic);
//creates the series JScrollPane
JScrollPane seriesPanel = stuff.showSeries(seriesLogic);
//creates a JLayeredPane in which I want to insert the JScrollPanes as layers
layerPanel = new JLayeredPane();
//adds the moviePanel to index 3 and seriesPanel to index 5 in the JLayeredPane
//I´m assuming index 3 is not as deep as index 5, meaning moviePanel should be in the front,
//but I have also tried switching indexes just in case
layerPanel.add(moviePanel, 3);
layerPanel.add(seriesPanel, 5);
//another attempt at getting the moviePanel to the front of the JLayeredPane, but
//seriesPanel still shows up on top
layerPanel.moveToFront(moviePanel);
我遗漏了什么或做错了什么?同样,最简单的解决方案可能是使用JList和swap模型。例如,以下使用两个模型,一个显示一周中其他几天的颜色字符串,并且在按钮的动作侦听器中交换模型:
import java.awt.BorderLayout;
import javax.swing.*;
public class SwapStuff extends JPanel {
public static final String[] DAYS_OF_WEEK = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday" };
public static final String[] COLORS = { "Red", "Orange", "Yellow", "Green", "Blue", "Violet" };
private DefaultListModel<String> dayModel = new DefaultListModel<>();
private DefaultListModel<String> colorModel = new DefaultListModel<>();
private JList<String> list = new JList<>(dayModel);
private JTextField displayField = new JTextField(20);
public SwapStuff() {
for (String element : DAYS_OF_WEEK) {
dayModel.addElement(element);
}
for (String element : COLORS) {
colorModel.addElement(element);
}
list.setVisibleRowCount(5);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = new JScrollPane(list);
displayField.setFocusable(false);
JButton weekdayBtn = new JButton("Weekdays");
JButton colorBtn = new JButton("Colors");
weekdayBtn.addActionListener(e -> {
if (dayModel != list.getModel()) {
list.setModel(dayModel);
}
});
colorBtn.addActionListener(e -> {
if (colorModel != list.getModel()) {
list.setModel(colorModel);
}
});
list.addListSelectionListener(e -> {
String selection = list.getSelectedValue();
displayField.setText(selection);
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(weekdayBtn);
buttonPanel.add(colorBtn);
setLayout(new BorderLayout());
add(displayField, BorderLayout.PAGE_START);
add(scrollPane);
add(buttonPanel, BorderLayout.PAGE_END);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
SwapStuff mainPanel = new SwapStuff();
JFrame frame = new JFrame("SwapStuff");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}
导入java.awt.BorderLayout;
导入javax.swing.*;
公共类SwapStuff扩展了JPanel{
public static final String[]DAYS_OF_WEEK={“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”,
“星期六”};
公共静态最终字符串[]颜色={“红色”、“橙色”、“黄色”、“绿色”、“蓝色”、“紫色”};
private DefaultListModel dayModel=新的DefaultListModel();
private DefaultListModel colorModel=新的DefaultListModel();
私有JList列表=新JList(dayModel);
私有JTextField displayField=新JTextField(20);
公共交换文件{
for(字符串元素:天/周){
dayModel.addElement(元素);
}
for(字符串元素:颜色){
颜色模型.附加元素(元素);
}
列表。设置VisibleRowCount(5);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane=新的JScrollPane(列表);
displayField.setFocusable(假);
JButton weekdayBtn=新JButton(“工作日”);
JButton colorBtn=新JButton(“颜色”);
weekdayBtn.addActionListener(e->{
if(dayModel!=list.getModel()){
list.setModel(dayModel);
}
});
colorBtn.addActionListener(e->{
if(colorModel!=list.getModel()){
list.setModel(colorModel);
}
});
list.addListSelectionListener(e->{
字符串选择=list.getSelectedValue();
displayField.setText(选择);
});
JPanel buttonPanel=新的JPanel();
按钮面板添加(工作日BTN);
按钮面板添加(颜色BTN);
setLayout(新的BorderLayout());
添加(displayField,BorderLayout.PAGE_START);
添加(滚动窗格);
添加(按钮面板,边框布局。页面\结尾);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
私有静态void createAndShowGui(){
SwapStuff主面板=新的SwapStuff();
JFrame=新JFrame(“SwapStuff”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
添加框架(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
}
最好创建并发布一个像样的程序。话虽如此,我确实想知道您是否想要使用CardLayout,一种可以轻松交换可视化组件和容器的布局。这就是你做错的地方:layerPanel.setLayout(newborderlayout())代码>。这会使JLayeredPane自身的内部布局无效,并使其不起作用。您不应该显式设置JLayeredPane的布局,而让它使用自己的本机布局。但是,您可以设置它所容纳的容器的布局。这是否回答了您的问题?编辑后,我不再将layerPanel的布局设置为BorderLayout。现在JLayeredPane什么也没有显示,我猜是因为我必须手动设置层中JScrollPane的大小和位置,但我不知道如何设置它,这样它就占用了层中所有的可用空间。你能给我指一下正确的方向吗?当然,我们也会继续谷歌搜索。只需按照之前的建议使用卡片布局即可