JList تحتوي على JCheckBox وسلسلة، مع عدم السيطرة انقر فوق التحديد؟

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

سؤال

ومنذ بعض الوقت نشرت لي هنا، والآن أنا في نقطة حيث أجد نفسي عالقا مرة أخرى.

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

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

وماذا لقد كنت تحاول القيام به، هو خلق العارض خلية مخصصة والتي سوف تسمح باستخدام خانة الاختيار في JList من. أنا تقريبا حصلت على هذا العمل من خلال النظر هنا ( HTTP: / /java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer ) وهنا (<لأ href = "http://www.jroller.com/santhosh/entry/jlist_with_checkboxes "يختلط =" noreferrer نوفولو "> http://www.jroller.com/santhosh/entry/jlist_with_checkboxes )، ولكن لا حظ. يشرح الحلقة الأولى كيفية إنشاء خلية العارض العرف، ولكن لا تحقق boxs، والثاني يشرح كيفية القيام boxs الاختيار. يمكنني الحصول boxs الاختيار لعرض، ولكن بعد ذلك هذا هو كل ما يعرض.

في المثال الأخير، يجب النقر على مربع لأنفسهم من أجل أن أعضاء القائمة التي سيتم اختيارها. ما أود أن تكون قادرة على القيام به، هو السماح للمستخدم النقر على أي من عناصر القائمة أو خانة الاختيار لتحديد العنصر.

في إصدار تحقق فقط boxs التي حصلت على العمل، وعملت التحديد، ولكن السيطرة ما زال يتعين الاحتفاظ باستمرار للسلع المتعددة التي سيتم اختيارها. هل هناك أي طريقة لتجعل من ذلك ليست هناك حاجة السيطرة لاختيار متعددة من العناصر؟ وأنا أعلم أنك تستطيع قراءة معدلات على النقرة، ولكن أي فكرة إذا يمكنك تطبيقها على النقر على الكائن المحدد.

وأفكارك، والتعليقات والاقتراحات، وصلات والإجابات الصحيحة كلها موضع ترحيب كبير! :)

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

المحلول

وهذا يفعل، نوع من. على الرغم من انها مزورة أساسا لأن خانات لا حقا تفعل أي شيء، بعد فحصها يفعل حدد العنصر القائمة.

import java.awt.Component;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;


public class Relequestual extends JFrame {

   private final FunkyCellRendererComponent funkyCRC = new FunkyCellRendererComponent();

   public Relequestual() {
      getContentPane().setLayout(new FlowLayout());

      String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" };
      JList theList = new JList(items);
      theList.setCellRenderer(
      new ListCellRenderer() {
         @Override
         public Component getListCellRendererComponent(JList list, Object value, int index,
               boolean isSelected, boolean cellHasFocus) {
            funkyCRC.setup(list, value, index, isSelected, cellHasFocus);
            return funkyCRC;
         }
      });
      getContentPane().add(theList);

   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      Relequestual gui = new Relequestual();
      gui.pack();
      gui.setVisible(true);
   }

   class FunkyCellRendererComponent extends JPanel {

      private JCheckBox checkBox = new JCheckBox();
      private JLabel label = new JLabel();
      private JList list;
      private int index;

      public FunkyCellRendererComponent() {
         super(null);
         setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
         add(this.checkBox);
         add(this.label);
      }

      public void setup(JList list, Object value, int index,
               boolean isSelected, boolean cellHasFocus) {
         this.list = list;
         this.index = index;
         this.label.setText((String) list.getModel().getElementAt(index)); 
         if (isSelected) {
            setForeground(list.getSelectionForeground());
            setBackground(list.getSelectionBackground());
         } else {
            setForeground(list.getForeground());
            setBackground(list.getBackground());
         }
         this.checkBox.setSelected(isSelected);
      }

   }

}

نصائح أخرى

وأود أن استخدام JTable وإضافة خانة الاختيار بمثابة عمود منفصل.

ويمكنك بعد ذلك إضافة MouseListener الى طاولة المفاوضات وكلما تم فحص العمود الآخر الذي تبديل قيمة مربع.

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