سؤال

ولقد لكتابة برنامج صغير، في الجانب الأيسر لا بد لي من استخدام لوحة تحتوي على قائمة من المركبات التي يمكن أن تكون قائمة من الأزرار، ما هي المشكلة، لا تعطى عدد من المركبات !!! لذلك، ولست بحاجة إلى التمرير لوحة عند عدد من المركبات هو أكثر من اللازم،

وأفعل هذا لjframe، لكنه لم ينجح الصحيح مع لوحة، الرجاء مساعدتي مع مثال

ورمز يمكنني استخدام لوحة التمرير هو:

 public class VehicleList extends JPanel {
    private ArrayList<VehicleReport> vehicles;
    private ArrayList<JButton> v_buttons =  new ArrayList<JButton>();



 public void showList(ArrayList<Vehicles> vehicles)
 {
   this.vehicles = vehicles;
   //...
    add(getScrollpane());
    setSize(155,300);

 }

public JScrollPane getScrollpane()
{
  JPanel panel = new JPanel();
  panel.setPreferredSize(new DimensionUIResource(150, 300));
   GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints constraint = new GridBagConstraints();
    panel.setLayout(gridbag);
    constraint.fill = GridBagConstraints.HORIZONTAL;
    JLabel title = new JLabel("Vehiles list");
    constraint.gridwidth = 2;
    constraint.gridx = 0;
    constraint.gridy = 0;
    constraint.ipady = 230;
    gridbag.setConstraints(title, constraint);
    panel.add(title);
    // end of set title
    constraint.gridwidth = 1;
    int i=1;

    for(JButton jb : v_buttons )
    {
        constraint.gridx =0;
        constraint.gridy = i;
        gridbag.setConstraints(jb, constraint);
        panel.add(jb);
        JLabel vehicle_lable = new JLabel("car" + i);
        constraint.gridx = 1;
        constraint.gridy = i;
        gridbag.setConstraints(vehicle_lable, constraint);
        panel.add(vehicle_lable);
        i++;
    }
JScrollPane jsp = new JScrollPane(panel);
 return jsp;

و}

و}

وفي jaframe بعد إضافة jscrollpane إلى jframe أضع هذا

وحزمة ()؛

وsetSize (250، 250)؛

وsetLocation (100، 300)؛

ووالعمل بشكل واضح !!!!

هل كانت مفيدة؟

المحلول

وأنت أيضا لا تبين لنا مدير التخطيط للVehicleList JPanel. في حال كنت لم يحدد ذلك، لأنه تخلف عن FlowLayout، على عكس JFrame (والتي ذكرت هذا يعمل في)، الذي جزء المحتويات الافتراضي BorderLayout. لذلك ربما كنت بحاجة فقط لتغيير رمز ذات الصلة من:

//...
add(getScrollpane());

إلى

//...
setLayout(new BorderLayout());
add(getScrollpane(), BorderLayout.CENTER);

نصائح أخرى

وتحتاج إلى تعيين سياسة التمرير على الأفقي والرأسي:

public void setHorizontalScrollBarPolicy(int policy)
public void setVerticalScrollBarPolicy(int policy)

وعن طريق:

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS 

و:

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
JScrollPane.VERTICAL_SCROLLBAR_NEVER
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS 

وهكذا على سبيل المثال:

jscrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top