JScrollPane中的JTabbedPane一次只显示一个项目



当我启动我的应用程序时,它会启动JFrame并加载包含JScrollPaneJTabbedPane,但它一次只显示其中的一个组件。我已经尝试了一切,但仍然无法解决问题...

这是我的代码:

package test;
import java.awt.*;
import javax.swing.*;
public class Main extends JFrame{
public Main()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400,500);
    JPanel pane=new JPanel();
    pane.setLayout(new BorderLayout());
    UIManager.put("TabbedPane.contentOpaque", false);
    JTabbedPane tabbedPane=new JTabbedPane();
    JScrollPane scrollPane=new JScrollPane(pane);
    tabbedPane.setPreferredSize(new Dimension(getWidth(),getHeight()));
    for(int i = 0; i < 10; i++) pane.add(new JLabel("label22222222222222222222222222222222222222222222222222222222"+i));
   //pane.add(scrollPane,BorderLayout.CENTER);
    tabbedPane.add("Test",scrollPane);      
    add(tabbedPane);
}
public static void main(String[] args) {
    Main main=new Main();
    main.setVisible(true);
}
}

请帮助我,我不知道我做错了什么。

您的窗格 JPanel 使用 BorderLayout,并且您以默认方式或 BorderLayout.CENTER 添加组件。这是仅显示最后添加的组件的预期行为。

应考虑使用其他布局,如网格布局。此外,谷歌并阅读"在容器中布置组件"教程,并了解您正在使用的布局。

此外,请考虑使用 JList 而不是 JLabel 网格来显示数据。

顺便说一句,您应该格式化代码以提高可读性,而不是紧凑性。不要只在一行上放置 for 循环。事实上,所有循环和块都应该放在大括号中,以防止你以后编辑代码,添加另一行并认为它在循环中,而事实并非如此。


编辑
例如,使用 JList:

import javax.swing.*;
public class Main2 {
   private static final int MAX_CELLS = 30;
   private static void createAndShowGUI() {
      final DefaultListModel<String> listModel = new DefaultListModel<>();
      final JList<String> myList = new JList<>(listModel);
      myList.setVisibleRowCount(8);
      for (int i = 0; i < MAX_CELLS; i++) {
         listModel.addElement("label22222222222222222222222222222222222222222222222222222222" + i);
      }
      JTabbedPane jTabbedPane = new JTabbedPane();
      jTabbedPane.add("Test", new JScrollPane(myList));
      JFrame frame = new JFrame("Main2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(jTabbedPane);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

最新更新