2013-04-03 2 views
3

У меня есть графический интерфейс, который выглядит следующим образом: GUI Когда я нажимаю на кнопку addComponent появляются новые JPanels добавляют к ScrollPane (1), добавляются JPanels но ScrollPane не прокруткой , происходит то, что он добавляет новые JPanels, а jPanels уменьшаются по размеру.Динамическое добавление JPanels к JScrollPane

Таким образом, моя проблема заключается в том, что панели вставляются в 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); 


    } 
} 

ответ

3

JPanel (ваш JScrollPane вид компонента) использует FlowLayout по умолчанию, который уважает предпочтительные размеры компонентов. Вы можете переопределить getPreferredSize вашего добавленного JPanels, чтобы правильно их отсортировать. Без этого JScrollPane рассчитывает все размеры, чтобы они соответствовали ViewPortView.

Side Примечание: Избегайте использования абсолютного позиционирования (null макета) и использовать layout manager.

+0

Большое спасибо, теперь размер остался прежним, а полосы прокрутки – Bjorn

0

Вы можете заставить в JScrollPane, чтобы изменить размер с.

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

'setViewport (n)' ?? не должно быть 'v'? – BRHSM

+0

Я так считаю. Хорошая уловка –

Смежные вопросы