当前位置: 首页 > 知识库问答 >
问题:

如何创建一个动态大小的JScrollPane w/JPanel作为客户端?

祁霖
2023-03-14

在我的代码中,用户可以使用菜单向主JPanel添加新按钮。JPanel利用FlowLayout表单,因此根据窗口的大小,每行上的数量或按钮都会发生变化,以适应最佳视图。。。在我介绍JScrollPane之前,情况就是这样。现在我有两个问题:

>

  • 一旦用户将窗口重新调整到首选大小或更低,每行按钮的#将停止更改。*以前没有这个问题,即使设置了首选尺寸。

    我只能滚动查看JPanel首选大小范围内的按钮。放置在外部的任何内容都无法查看,并且不会增加JScrollPane范围的大小。

    代码如下:

    package testit;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Insets;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.KeyStroke;
    import javax.swing.border.LineBorder;
    
    class TestIt extends JFrame implements ActionListener {
        //Main window frame, content panel and scroll pane
        private JFrame main_frame;
        private JPanel main_panel;
        private JScrollPane main_scroll;
    
        //Screen size
        private Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
    
        public TestIt() {
            //Set up the main frame
            main_frame = new JFrame("Test Program");
            main_frame.setLayout(new BorderLayout());
            main_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            main_frame.setIconImage(
                    new ImageIcon("src/testit/resources/img/app_icon.gif").getImage());
    
            //Set up the content panel and add it to the scroll pane
            main_panel = new JPanel();
            main_panel.setLayout(new FlowLayout());
            main_panel.setPreferredSize(
                    new Dimension(screen.width/10 * 6, screen.height/10 * 6));
            main_scroll = new JScrollPane(main_panel);
    
            //Add the menu bar and the scroll pane to the main frame
            main_frame.add(main_scroll, BorderLayout.CENTER);       
            main_frame.setJMenuBar(createMenuBar());
    
            //Display the main GUI
            main_frame.pack();
            main_frame.setLocationRelativeTo(null);
            main_frame.setVisible(true);
    
        }
    
        private JMenuBar createMenuBar() {
            //Create the top menu bar
            JMenuBar top_menu_bar = new JMenuBar();
    
            //Create the menu
            JMenu main_menu = new JMenu ("Menu");
            main_menu.setMnemonic(KeyEvent.VK_M);
            top_menu_bar.add(main_menu);
    
            //Create the menu items and add them to the menu
            JMenuItem menu_item;
    
            menu_item = new JMenuItem("Add New");
            menu_item.setMnemonic(KeyEvent.VK_N);
            menu_item.setAccelerator(
                    KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK));
            menu_item.setActionCommand("new");
            menu_item.addActionListener(this);
            main_menu.add(menu_item);
    
            menu_item = new JMenuItem("Save");
            menu_item.setMnemonic(KeyEvent.VK_S);
            menu_item.setAccelerator(
                    KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
            menu_item.setActionCommand("save");
            menu_item.addActionListener(this);
            main_menu.add(menu_item);
    
            menu_item = new JMenuItem("Exit");
            menu_item.setMnemonic(KeyEvent.VK_X);
            menu_item.setAccelerator(
                    KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
            menu_item.setActionCommand("exit");
            menu_item.addActionListener(this);
            main_menu.add(menu_item);
    
            //Return the assembled menu bar
            return top_menu_bar;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            switch (e.getActionCommand()) {
                case "new":
                    createThumb();
                    break;
                case "save":
                    break;
                default:
                    quit();
                    break;
            }
        }
    
        private void createThumb() {
            //Width and height for the thumbnail button
            final int H = 170;
            final int W = 150;
    
            //Set up the thumbnail button
            ImageIcon image = new ImageIcon("src/testit/resources/img/test.gif");       
            JButton thumb = new JButton(image);
            thumb.setMargin(new Insets(0, 0, 0, 0));
            thumb.setBorder(new LineBorder(Color.BLACK));
            thumb.setBackground(Color.BLACK);
            thumb.setPreferredSize(new Dimension(W, H));
            thumb.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    openNewFrame();
                }
            });
            main_panel.add(thumb);
            main_panel.validate();
        }
    
        private void openNewFrame() {
            JFrame new_window = new JFrame();
            new_window.setPreferredSize(new Dimension(400, 800));
            new_window.pack();
            new_window.setLocationRelativeTo(null);
            new_window.setVisible(true);
        }
    
        private void quit() {
            System.exit(0);
        }
    
        //Create an instance of the program
        private static void runIt() {
            TestIt program = new TestIt();
        }
    
        public static void main(String [] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    runIt();
                }
            });
        }
    }
    

    我尝试了很多方法,我一直在挖掘Javadoc。。。。我读了很多东西和教程,但仍然无法使我的滚动/重新调整大小工作。

  • 共有1个答案

    魏翔
    2023-03-14

    当您设置组件的preferredSize时,您可以修复它的大小,这样它就不会在JScrollPane中展开。一个解决方案是不这样做,不固定容纳JButtons的容器的大小。

    例如,

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class TestIt2 extends JPanel {
       private static final Dimension THUMB_SIZE = new Dimension(170, 150);
       private Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
       private JPanel thumbPanel = new JPanel(new GridLayout(0, 6, 5, 5));
    
       public TestIt2() {
          JPanel holderPanel = new JPanel(new BorderLayout());
          holderPanel.add(thumbPanel, BorderLayout.NORTH);
          holderPanel.add(Box.createGlue(), BorderLayout.CENTER);
    
          setLayout(new BorderLayout());
          add(new JScrollPane(holderPanel), BorderLayout.CENTER);
       }
    
       public JMenuBar createMenuBar() {
          JMenuBar top_menu_bar = new JMenuBar();
          JMenu main_menu = new JMenu("Menu");
          main_menu.setMnemonic(KeyEvent.VK_M);
          top_menu_bar.add(main_menu);
          JMenuItem menu_item;
    
          menu_item = new JMenuItem("Add New");
          menu_item.setMnemonic(KeyEvent.VK_N);
          menu_item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
                ActionEvent.ALT_MASK));
          menu_item.setActionCommand("new");
          menu_item.addActionListener(new ActionListener() {
    
             @Override
             public void actionPerformed(ActionEvent arg0) {
                createThumb();
             }
          });
          main_menu.add(menu_item);
    
    
          return top_menu_bar;
       }
    
       protected void createThumb() {
          JButton thumb = new JButton("Thumb");
          thumb.setPreferredSize(THUMB_SIZE);
          thumbPanel.add(thumb);
          revalidate();
          repaint();
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(screen.width / 10 * 6,
                screen.height / 10 * 6);
       }
    
       private static void createAndShowGui() {
          TestIt2 mainPanel = new TestIt2();
    
          JFrame frame = new JFrame("TestIt2");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.setJMenuBar(mainPanel.createMenuBar());
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
     类似资料:
    • 我真的对此感到困惑。我在做“微旅行”游戏。这是手机游戏,但我是为电脑制作的。我有一个扩展JPanel的背景类,它只绘制一个从0开始的矩形,并且有屏幕的大小(我的游戏是全屏)。我有一个主菜单类,它也扩展了JPanel。我想在那里添加主菜单的所有内容。然后,我将所有内容添加到扩展JFrame的GameFrame类中。我有一个main类,它只是调用GameFrame类。下面是我的代码:背景类: Main

    • 问题内容: 因此,我正在查看文档,并且完全没有使用任何方法的示例。我正在研究使用socks5。该函数的外观如下: 现在一切都说得通了,除了我对哪个是类型感到困惑,函数本身返回了一个。其他一切都有意义,只是前进就把我赶走了。我如何设置我的客户使用socks5 Dialer? 问题答案: 因此,只要有兴趣在此处设置socks5客户的人,我都可以找到我问题的答案:

    • 我一直在尝试对JavaFX阶段进行缩放转换,以替换应用程序主窗口的当前场景(在本例中为登录帧)。 当发生这种情况时,由于新场景更大,窗口的大小会以一种不优雅的方式突然被重新调整。

    • 我正在开发一个C应用程序,可以计算一些值。我需要把这些值放在一个x×x的字符串数组中。如果我知道“x”是一个例子,我知道我可以做: 不幸的是,我不知道“x”将是什么。有没有一种方法可以在C#中动态增长矩阵?如果是,如何?

    • 问题内容: 有没有办法复制通用结构(即属性名称未知的结构)并跳过单个已知属性? 这是我所知道的: 我函数的参数-我将称为参数-类型。 是一个结构。 具有已知的性质。 具有0到6左右的其他属性,这些属性都不是先验的。 一旦删除该属性,那么“剩余”就是30种可能的结构类型之一。 所以我想剥离出来(或更精确地进行复制,它省略),所以生成的代码的各个位,尝试了结构迫使其可能的类型之一就能成功。 我已经找到

    • 问题内容: 我在使用primefaces树实现实现动态树结构时遇到了一些麻烦。在primeface提供的展示柜中,代码的结构如下所示。但是,这是非常静态的。我试图弄清楚如何处理从数据库中获取的数据,在编译时树的深度是未知的。 我以为我可能需要某种递归方法来实现此目的,但我无法完全理解实现的样子。 有什么想法吗? 以下是primefaces的示例代码 问题答案: