代码之家  ›  专栏  ›  技术社区  ›  Bjorn

将JPanels动态添加到JScrollPane

  •  3
  • Bjorn  · 技术社区  · 13 年前

    我有一个GUI,如下所示: GUI 当我按下按钮addComponent时,滚动窗格中添加了新的JPanels(1),添加了JPanels,但滚动窗格没有滚动,结果是添加了新JPanels而JPanels的大小正在减小。

    因此,我的问题是,这些面板被插入到JScrollPane中,并且这些面板的大小正在减小,但没有滚动条。

    这是我已经播得很远的代码:

        public class ContractForm extends JFrame {
    
        private JPanel contentPane;
        private JTextField txtContractID;
        private JScrollPane scrollPane; 
        private JButton btnAddComponent;
        private JButton btnOk;
        private JComboBox<Customer> comboBoxCustomer;
        private JButton btnCancel;
        private ArrayList<JPanel> rows;
        private JPanel panel;
        private Dimension size;
    
    
        /**
         * Create the frame.
         */
        public ContractForm() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(250, 250, 654, 476);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null);
    
                    rows = new ArrayList<JPanel>();
    
            JLabel lblContractid = new JLabel("ContractID");
            lblContractid.setBounds(50, 11, 78, 14);
            contentPane.add(lblContractid);
    
            txtContractID = new JTextField();
            txtContractID.setBounds(138, 8, 86, 20);
            contentPane.add(txtContractID);
            txtContractID.setColumns(10);
    
            JLabel lblNewLabel = new JLabel("Customer");
            lblNewLabel.setBounds(276, 11, 69, 14);
            contentPane.add(lblNewLabel);
    
            comboBoxCustomer = new JComboBox<Customer>();
            comboBoxCustomer.setBounds(355, 8, 235, 20);
            contentPane.add(comboBoxCustomer);
    
            JLabel lblYear = new JLabel("Year:");
            lblYear.setBounds(50, 37, 46, 14);
            contentPane.add(lblYear);
    
            JSpinner spinner = new JSpinner();
            spinner.setBounds(138, 31, 86, 20);
            contentPane.add(spinner);
    
            scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setBounds(0, 59, 628, 312);
            contentPane.add(scrollPane);
    
            panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            size = panel.getSize();
            scrollPane.setViewportView(panel);
    
    
            btnAddComponent = new JButton("addComponent");
            btnAddComponent.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    ArrayList<JobDescription> jobs = Database.getInstance().getJobDescription();
                    JobDescriptionContractRow row = new JobDescriptionContractRow(jobs);
                    rows.add(row);
                    panel.add(row);
                    scrollPane.repaint();
                    scrollPane.revalidate();
    
                }
            });
            btnAddComponent.setBounds(355, 30, 114, 23);
            contentPane.add(btnAddComponent);
    
            btnOk = new JButton("Ok");
            btnOk.setBounds(185, 382, 89, 23);
            contentPane.add(btnOk);
    
            btnCancel = new JButton("Cancel");
            btnCancel.setBounds(298, 382, 89, 23);
            contentPane.add(btnCancel);
    
    
    
    
        }
    }
    
    public class JobDescriptionContractRow extends JPanel {
        private JTextField textField;
        private JButton btnRemove;
    
        /**
         * Create the panel.
         */
        public JobDescriptionContractRow(ArrayList<JobDescription> jobs) {
            setLayout(null);
    
            JLabel lblJobdescription = new JLabel("Job description");
            lblJobdescription.setBounds(10, 14, 94, 14);
            add(lblJobdescription);
    
            JComboBox<JobDescription> comboBox = new JComboBox<JobDescription>();
            comboBox.setBounds(102, 11, 149, 20);
            for(JobDescription job : jobs){
                comboBox.addItem(job);
            }
            comboBox.setSelectedItem(null);
            add(comboBox);
    
            textField = new JTextField();
            textField.setBounds(365, 11, 86, 20);
            add(textField);
            textField.setColumns(10);
    
            JLabel lblNewLabel = new JLabel("Contract price");
            lblNewLabel.setBounds(277, 14, 78, 14);
            add(lblNewLabel);
    
            JButton btnRemove = new JButton("remove");
            btnRemove.setBounds(469, 10, 89, 23);
            add(btnRemove);
    
    
        }
    }
    
    2 回复  |  直到 13 年前
        1
  •  3
  •   Reimeus    13 年前

    JPanel (你的 JScrollPane 视图组件)使用 FlowLayout 默认情况下,这与组件的首选尺寸有关。您可以覆盖 getPreferredSize JPanels 以正确调整它们的大小。如果不这样做 滚动面板 计算所有尺寸以适应 ViewPortView .

    旁注: 避免使用绝对定位( null 布局),并使用 layout manager .

        2
  •  0
  •   Daan Luttik    10 年前

    您可以使用强制调整JScrollPane的大小。

    JViewport v = new JViewport();
    v.setSetViewSize(new Dimention(width,height));
    scroll.setViewport(v);