JTable أو بعض فئات جدول Java الأخرى مع تحديد الخلايا المتقدم؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

الآن أستخدم JTable لما أفعله.بعد البحث في Java API وموارد الويب المختلفة، لا أعتقد أن JTable سيقطعها بعد الآن.ما أبحث عنه هو جدول يمكنني من خلاله تحديد إجراءات اختيار صارمة للغاية.لا أريد أن أكون قادرًا على تحديد الصفوف والأعمدة فحسب، بل أريد أيضًا تحديد الخلايا في اتجاه قطري.والأكثر من ذلك، أحتاج إلى القدرة الشاملة حتى أتمكن من تحديد الخلايا التي يمكن تحديدها عندما تكون في خلية أخرى.

على سبيل المثال، إذا كان لدي جدول 10x10 وأنا في الخلية (4، 3) [(صف، عمود)]، أريد أن أكون قادرًا على القول، حسنًا، يمكنك تحديد الفواصل الزمنية التالية من هنا:

  • (4، 3) إلى (4، 10)
  • (4، 3) إلى (4، 1)
  • (4، 3) إلى (10، 4)
  • (4، 3) إلى (1، 4)
  • (4، 3) إلى (10، 10) [قطريًا]
  • (4، 3) إلى (1، 1) [قطريًا]
  • (4، 3) إلى (1، 6) [قطريًا]
  • (4، 3) إلى (6، 1) [قطريًا]

أي أفكار حول كيف يمكنني القيام بذلك؟

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

المحلول

لا يبدو أنك تقوم بتصميم "طاولة" حقًا.(يفترض JTable دلالات الجدول ويستخدم نموذج تحديد القائمة.) ومع ذلك، لا أعتقد أنه بعيد جدًا عن المصفوفة، إذا كنت على استعداد لاختراق كود JTable.

البديل هو المكون الخاص بك (نعم):لوحة JPanel تحتوي على خلايا المصفوفة.يجب تفويض جميع عمليات معالجة أحداث لوحة المفاتيح/الماوس إلى JPanel الأصل.بالتأكيد أوصي باستنساخ المجموعات الفرعية والتصميمات ذات الصلة من JTable (نموذج البيانات، نموذج الاختيار، وما إلى ذلك).

لذلك، في الأساس، سوف تحتاج إلى 3 فصول:

جماتريكس، جماتريكسموديل، جماتريكسسيلكشنموديل.

JMatrix هو JPanel الممتد بمكوناته الفرعية.JMatrixSelectionModel هي الفئة التي ستطبق قواعد الاختيار.يجب على JMatrix استدعاء نموذج التحديد في أحداث التحديد (المسجلة في خلايا المصفوفة، والمفوضة إلى المعالج على JMatrix الأصل).نموذج البيانات واضح ومباشر إلى حد ما - قد تتمكن حتى من استخدام JTableModel الموجود.

نصائح أخرى

أنا في وضع مماثل.كان الحل الذي قدمته (آسف، لا أريد كتابة فصل دراسي ضخم) هو إضافة Cell Renderer لجميع الأعمدة والذي كان بمثابة مستمع للماوس للجدول.وبما أن العارض يعرف الأزرار التي تم تحديدها، فيمكنه عرضها بشكل مختلف.

public class MultipleSelectionRenderer extends DefaultTableCellRenderer implements MouseListener {
    private JTable table;
    private Map<String, Boolean> selectedMap = new LinkedHashMap<String, Boolean>();
    TableUpdateIfc updater;
public MultipleSelectionRenderer(TableUpdateIfc updater, JTable table, Map<String, Boolean> selectedMap) {
    this.table = table;
    this.selectedMap = selectedMap;
    this.updater = updater;
}

@Override
public void mouseReleased(MouseEvent e) {
    if(e.getSource() == table){
        try {
            if(!e.isControlDown())
                selectedMap.clear();
            selectedMap.put(table.getSelectedRow()+":"+table.getSelectedColumn(), true);
        } catch (Exception ex) {
            selectedMap.clear();
        }
    }
    updater.updateMultipleSelectionTable(table);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) { }
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}

/**
 *
 * @param table
 * @param value
 * @param isSelected
 * @param hasFocus
 * @param row
 * @param column
 * @return
 */
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component result =super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if(selectedMap.get(row+":"+column) != null && selectedMap.get(row+":"+column) == true) {
        setText(getHTMLString(value));
    }
    return result;
}

private String getHTMLString(Object value){
    String html = "<html><body><table cellpadding=0><tr>";
    html = html + "<td bgcolor=#bf65a5>";
    html = html + value.toString();
    html = html + "</td><td>&nbsp;" + value+"</td>";
    html = html + "</tr></table></body></html>";
    return html;
}

}

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