كيف يمكنني تقديم قائمة مع مربعات في جافا سوينغ ؟

StackOverflow https://stackoverflow.com/questions/19766

  •  09-06-2019
  •  | 
  •  

سؤال

ما يمكن أن يكون أفضل طريقة للحصول على قائمة من البنود مع مربع لكل منهما في جافا سوينغ ؟

أولا-هاء.أ JList مع العناصر التي لديها بعض النص و الاختيار كل ؟

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

المحلول

إنشاء مخصص ListCellRenderer و asign إلى JList.

هذا العرف ListCellRenderer لا بد من العودة JCheckbox في implementantion من getListCellRendererComponent(...) الأسلوب.

ولكن هذا JCheckbox لن تكون قابلة للتعديل ، هو رسم بسيط في الشاشة يمكنك اختيار متى هذا JCheckbox يجب أن يكون 'تكتك' أم لا ،

على سبيل المثال ، تظهر تكتك عند تحديد الصف (المعلمة isSelected) ، ولكن هذه الطريقة في فحص الحالة سوف لا يكون mantained إذا كان اختيار التغييرات.من الأفضل أن تظهر أنها راجعت استشارية البيانات أدناه ListModel, ولكن بعد ذلك يمكنك تنفيذ الأسلوب الذي يغير التحقق من حالة البيانات ، وإخطار تغيير JList أن يكون طلاء.

أنا سيتم نشر التعليمات البرمجية في وقت لاحق إذا كنت في حاجة إليها

ListCellRenderer

نصائح أخرى

إجابة رائعة هي هذه CheckBoxList.وتنفذ Telcontar الجواب (رغم 3 سنوات من قبل :)...أنا استخدامه في جافا 1.6 مع أية مشاكل.لقد أضاف أيضا وهو addCheckbox الطريقة مثل هذا (بالتأكيد يمكن أن تكون أقصر ، لم تستخدم جافا في كل حين):

public void addCheckbox(JCheckBox checkBox) {
    ListModel currentList = this.getModel();
    JCheckBox[] newList = new JCheckBox[currentList.getSize() + 1];
    for (int i = 0; i < currentList.getSize(); i++) {
        newList[i] = (JCheckBox) currentList.getElementAt(i);
    }
    newList[newList.length - 1] = checkBox;
    setListData(newList);
}

حاولت التجريبي على Jidesoft الأشياء اللعب مع CheckBoxList واجهت بعض المشاكل (السلوكيات التي لا تعمل).سوف تعديل هذا الجواب إذا وجدت مشاكل مع CheckBoxList أنا مرتبطة.

ربما كنت تبحث لاستخدام JTable بدلا من JList و منذ الافتراضي تقديم مربع بدلا من القبيح لكان من المحتمل أن يتطلع إلى انخفاض مخصص TableModel, CellRenderer و CellEditor تمثل قيمة منطقية.بالطبع أنا أتصور هذا تم القيام به ملايين مرات بالفعل.الشمس أمثلة جيدة.

فقط تنفيذ ListCellRenderer

public class CheckboxListCellRenderer extends JCheckBox implements ListCellRenderer {

    public Component getListCellRendererComponent(JList list, Object value, int index, 
            boolean isSelected, boolean cellHasFocus) {

        setComponentOrientation(list.getComponentOrientation());
        setFont(list.getFont());
        setBackground(list.getBackground());
        setForeground(list.getForeground());
        setSelected(isSelected);
        setEnabled(list.isEnabled());

        setText(value == null ? "" : value.toString());  

        return this;
    }
}

وتعيين العارض

JList list = new JList();
list.setCellRenderer(new CheckboxListCellRenderer());

وهذا سوف يؤدي إلى

CheckboxListCellRenderer example

التفاصيل في العرف البديل المكون عارضين.

PS:إذا كنت تريد راديو عناصر مجرد استبدال extends JCheckbox مع extends JRadioButton.

أفضل حل لـ Java 7 وأحدث

أنا تعثرت على هذا السؤال وأدركت أن بعض الإجابات جميلة القديمة والتي عفا عليها الزمن.في الوقت الحاضر ، JList هو عام وبالتالي هناك حلول أفضل.

الحل من عام JCheckBoxList:

import java.awt.Component;

import javax.swing.*;
import javax.swing.border.*;

import java.awt.event.*;

@SuppressWarnings("serial")
public class JCheckBoxList extends JList<JCheckBox> {
  protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

  public JCheckBoxList() {
    setCellRenderer(new CellRenderer());
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        int index = locationToIndex(e.getPoint());
        if (index != -1) {
          JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index);
          checkbox.setSelected(!checkbox.isSelected());
          repaint();
        }
      }
    });
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  public JCheckBoxList(ListModel<JCheckBox> model){
    this();
    setModel(model);
  }

  protected class CellRenderer implements ListCellRenderer<JCheckBox> {
    public Component getListCellRendererComponent(
        JList<? extends JCheckBox> list, JCheckBox value, int index,
        boolean isSelected, boolean cellHasFocus) {
      JCheckBox checkbox = value;

      //Drawing checkbox, change the appearance here
      checkbox.setBackground(isSelected ? getSelectionBackground()
          : getBackground());
      checkbox.setForeground(isSelected ? getSelectionForeground()
          : getForeground());
      checkbox.setEnabled(isEnabled());
      checkbox.setFont(getFont());
      checkbox.setFocusPainted(false);
      checkbox.setBorderPainted(true);
      checkbox.setBorder(isSelected ? UIManager
          .getBorder("List.focusCellHighlightBorder") : noFocusBorder);
      return checkbox;
    }
  }
}

بشكل حيوي إضافة JCheckBox القوائم تحتاج إلى إنشاء الخاصة بك ListModel أو إضافة DefaultListModel.

DefaultListModel<JCheckBox> model = new DefaultListModel<JCheckBox>();
JCheckBoxList checkBoxList = new JCheckBoxList(model);

على DefaultListModel عامة وبالتالي يمكنك استخدام الأساليب المحددة من قبل API جافا 7 هنا مثل هذا:

model.addElement(new JCheckBox("Checkbox1"));
model.addElement(new JCheckBox("Checkbox2"));
model.addElement(new JCheckBox("Checkbox3"));

احتمالات جيدة w/ Java أن شخصا ما قد نفذت بالفعل القطعة أو الأداة التي تحتاج إليها.جزء من فوائد كبيرة OSS المجتمع.لا تحتاج إلى إعادة اختراع العجلة إلا إذا كنت تريد حقا أن تفعل ذلك بنفسك.في هذه الحالة سيكون من الجيد ممارسة التعلم في CellRenderers والمحررين.

بلدي المشروع قد حقق نجاحا كبيرا مع جيدي.المكون تريد التحقق من مربع القائمة في جيدي المشتركة طبقة (وهو OSS و استضافتها على java.net).التجارية الاشياء هو جيد جدا, ولكن كنت لا تحتاج إليها.

http://www.jidesoft.com/products/oss.htm https://jide-oss.dev.java.net/

أنصحك استخدام JPanel مع جريدلايوت من 1 عمود.إضافة خانات إلى JPanel ، وتعيين JPanel كمصدر بيانات من JScrollPane.والحصول على اختيار خانات فقط اتصل getComponents() من JPanel للحصول على مربعات الاختيار.

هنا هو فقط قليلا بالإضافة إلى JCheckBoxList طريق راوة.هذا إضافة القدرة على تحديد باستخدام شريط الفضاء.إن تحديد عناصر متعددة ، كل مجموعة مقلوب قيمة البند الأول.

        addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            int index = getSelectedIndex();
            if (index != -1 && e.getKeyCode() == KeyEvent.VK_SPACE) {
                boolean newVal = !((JCheckBox) (getModel()
                        .getElementAt(index))).isSelected();
                for (int i : getSelectedIndices()) {
                    JCheckBox checkbox = (JCheckBox) getModel()
                            .getElementAt(i);
                    checkbox.setSelected(newVal);
                    repaint();
                }
            }
        }
        });

جميع من إجمالي المكونات في سوينغ--وهذا هو ، مكونات تتكون المكونات الأخرى ، مثل JTable, JTree ، أو JComboBox--يمكن تخصيصها للغاية.على سبيل المثال ، JTable مكون عادة تعرض شبكة JLabel مكونات, ولكن يمكن أيضا عرض JButtons, JTextFields, أو حتى غيرها JTables.الحصول على هذه التجميعية مكونات العرض غير افتراضي الكائنات هو الجزء السهل ، ولكن.مما يجعلها تستجيب بشكل صحيح إلى لوحة المفاتيح و الماوس أحداث مهمة أكثر صعوبة ، بسبب سوينغ فصل مكونات في "عارضين" و "المحررين." هذا الفصل كان (في رأيي) سوء اختيار التصميم و يؤدي إلا إلى تعقيد الأمور عندما يحاول تمديد البديل المكونات.

أن ترى ما أعني محاولة تحسين سوينغ JList عنصر بحيث يعرض خانات بدلا من التسميات.وفقا البديل فلسفة هذه المهمة يتطلب تنفيذ واجهات اثنين:ListCellRenderer (الرسم خانات) و CellEditor (التعامل مع لوحة المفاتيح و الماوس الأحداث على مربعات).تنفيذ ListCellRenderer واجهة من السهل بما فيه الكفاية ، ولكن CellEditor واجهة يمكن أن يكون بدلا الخرقاء و من الصعب أن نفهم.في هذه الحالة بالذات ، أود أن أقترح أن ننسى CellEditor تماما للتعامل مع المدخلات الأحداث مباشرة كما هو موضح في التعليمات البرمجية التالية.

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;

public class CheckBoxList extends JList
{
   protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

   public CheckBoxList()
   {
      setCellRenderer(new CellRenderer());

      addMouseListener(new MouseAdapter()
         {
            public void mousePressed(MouseEvent e)
            {
               int index = locationToIndex(e.getPoint());

               if (index != -1) {
                  JCheckBox checkbox = (JCheckBox)
                              getModel().getElementAt(index);
                  checkbox.setSelected(
                                     !checkbox.isSelected());
                  repaint();
               }
            }
         }
      );

      setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
   }

   protected class CellRenderer implements ListCellRenderer
   {
      public Component getListCellRendererComponent(
                    JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
      {
         JCheckBox checkbox = (JCheckBox) value;
         checkbox.setBackground(isSelected ?
                 getSelectionBackground() : getBackground());
         checkbox.setForeground(isSelected ?
                 getSelectionForeground() : getForeground());
         checkbox.setEnabled(isEnabled());
         checkbox.setFont(getFont());
         checkbox.setFocusPainted(false);
         checkbox.setBorderPainted(true);
         checkbox.setBorder(isSelected ?
          UIManager.getBorder(
           "List.focusCellHighlightBorder") : noFocusBorder);
         return checkbox;
      }
   }
}

هنا لا اعتراض نقرات الماوس من listbox ومحاكاة انقر على مربع الاختيار المناسب.والنتيجة هي "CheckBoxList" المكون الذي هو أبسط و أصغر من ما يعادل عنصر باستخدام CellEditor واجهة.استخدام الصف ببساطة مثيل ، ثم يمر ذلك بمجموعة من JCheckBox الكائنات (أو الفئات الفرعية من JCheckBox الأشياء) من خلال الاتصال setListData.لاحظ أن مربعات الاختيار في هذا العنصر لن تستجيب الضغط على المفاتيح (أيمفتاح المسافة), ولكن يمكنك دائما إضافة المفتاح الخاص بك المستمع إذا لزم الأمر.

المصدر: DevX.com

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top