2009-09-25 13 views
24

मैंने एक स्विंग जीयूआई बनाया है जिसमें कुछ पंक्तियों और स्तंभों के साथ जेटीबल है। मुझे जेटीबल में पंक्ति में एक बटन कैसे जोड़ना चाहिए?स्विंग जावा में जेटीबल की पंक्ति में बटन कैसे जोड़ें

उत्तर

32

आप इसे एक पंक्ति में नहीं जोड़ते - आप इसे सेल में जोड़ते हैं। This tutorial आपको बताता है कि आपको क्या चाहिए।

+2

ठीक है, धन्यवाद Droidln.net –

+7

धन्यवाद करने की कोई ज़रूरत नहीं है, बस निशान पर निशान लगाएं :) – Bostone

+2

waw! मैंने अभी उस उदाहरण को खोला और महसूस किया कि स्रोत कोड ने सेलएडिटर को "नया जेकेकबॉक्स" जोड़ा। लेकिन वास्तव में यह जेबटन के रूप में प्रस्तुत किया गया। वैसे भी, मेरा सवाल यह है कि, हमें जेकेकबॉक्स क्यों डालना चाहिए? :( – gumuruh

20

आप एक तालिका कक्ष के रूप में घटक जोड़ सकते हैं।

सबसे पहले, आपको एक कक्षा को लागू करना चाहिए जिसमें जेबटन को मूल वर्ग और दो इंटरफेस हैं जो TableCellRenderer और TableCellEditor हैं।

टेबलसेल एडिटर को लागू करने का कारण बटन के एक्शनवेन्ट प्राप्त करने के लिए है।

public class TableButton extends JButton implements TableCellRenderer, TableCellEditor { 
    private int selectedRow; 
    private int selectedColumn; 
    Vector<TableButtonListener> listener; 

    public TableButton(String text) { 
    super(text); 
    listener = new Vector<TableButtonListener>(); 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     for(TableButtonListener l : listener) { 
      l.tableButtonClicked(selectedRow, selectedColumn); 
     } 
     } 
    }); 
    } 

    public void addTableButtonListener(TableButtonListener l) { 
    listener.add(l); 
    } 

    public void removeTableButtonListener(TableButtonListener l) { 
    listener.remove(l); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, 
    Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
    return this; 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, 
     Object value, boolean isSelected, int row, int col) { 
    selectedRow = row; 
    selectedColumn = col; 
    return this; 
    } 

    @Override 
    public void addCellEditorListener(CellEditorListener arg0) {  
    } 

    @Override 
    public void cancelCellEditing() { 
    } 

    @Override 
    public Object getCellEditorValue() { 
    return ""; 
    } 

    @Override 
    public boolean isCellEditable(EventObject arg0) { 
    return true; 
    } 

    @Override 
    public void removeCellEditorListener(CellEditorListener arg0) { 
    } 

    @Override 
    public boolean shouldSelectCell(EventObject arg0) { 
    return true; 
    } 

    @Override 
    public boolean stopCellEditing() { 
    return true; 
    } 
} 

फिर, मैं निम्नलिखित के रूप में बटन घटना से निपटने के लिए TableButtonListener नाम के एक EventListener गयी।

public interface TableButtonListener extends EventListener { 
    public void tableButtonClicked(int row, int col); 
} 

और उपरोक्त रेंडरर/संपादक का उपयोग करें।

TableButton buttonEditor = new TableButton("Button"); 
buttonEditor.addButtonListener(new TableButtonListener() { 
    @Override 
    public void tableButtonClicked(int row, int col) { 
    // do something 
    }  
}); 

TableColumn col = new TableColumn(1, 80); 
col.setCellRenderer(buttonEditor); 
col.setCellEditor(buttonEditor); 

cols.addColumn(colPattern); 

आप प्रत्येक पंक्ति के लिए अलग बटन के लेबल प्रदर्शित करना चाहते हैं, तो आप getTableCellRendererComponent और getTableCellEditorComponent बटन के लेबल को संशोधित करने के लिए है जो में कोड ब्लॉक सम्मिलित करना चाहिए।

संपादित करें: कोड अब संकलित करता है। टेबलबटन कन्स्ट्रक्टर में ब्रैकेटिंग त्रुटि तय की गई।

+0

मदद के लिए धन्यवाद xrath। –

+3

-1 यह सेलएडिटर का अवैध कार्यान्वयन है: द्वारा अनुबंध, यह _must_ पंजीकृत सेलएडिटर लिस्टेनर्स को सूचित करता है। जो addEditorListener के खाली कार्यान्वयन के साथ यह मामूली रूप से नहीं हो सकता है ;-) सुपर कॉन्ट्रैक्ट _must_ कार्यान्वयन द्वारा परोसा जाता है, कोई रास्ता नहीं। – kleopatra

+1

मैंने कोशिश की, और मुझे मिला .... अपरिभाषित परिवर्तनीय 'श्रोता' ... वह क्या है? :( – gumuruh

संबंधित मुद्दे