एक JTable पर Ctrl + क्लिक व्यवहार बदलें

वोट
5

वहाँ एक आसान तरीका है जब वहाँ एक कुंजीपटल बटन दबाया जाता है (यानी। CTRL बटन) और एक पंक्ति का चयन किया गया विभिन्न कार्यक्षमता देने के लिए एक JTable पर नियंत्रण में हेरफेर करने के है? मैं एक मेज जहां Ctrl + click (माउस क्लिक) एक पंक्ति पर केवल एक चयनित पंक्ति का चयन रद्द होगा, एक पंक्ति का चयन कभी नहीं बनाने के लिए कहा गया है। उपयोगकर्ता Ctrl + एक अचयनित पंक्ति क्लिक करता है, कुछ नहीं होगा।

मैं Ctrl + A (सभी चुनें) की तरह एक तालिका बनाने के लिए, और कार्यों को निष्क्रिय कर लिया है, और मैं अगर नियंत्रण बटन जब एक MouseEvent उत्पन्न होता है दबाया जाता है की जाँच कर लिया है, लेकिन मैं आंकड़ा नहीं कर पा रहे बाहर कैसे Ctrl + क्लिक करें समायोजित किया जा सकता। यहाँ कुछ कोड है:

package nicky;

import javax.swing.*;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;

public class TableTester extends JPanel {
    public TableTester() {
        super(new GridLayout(1,0));

        final String[] columnNames = {First Name,
                                      Last Name,
                                      Sport,
                                      # of Years,
                                      Vegetarian};

        final Object[][] data = {
            {Tom,   Roberts,Athletic, new Integer(5),  new Boolean(false)},
            {Sarah, Watt,   Football, new Integer(3),  new Boolean(true)},
            {Laura, Brown,  Swimming, new Integer(2),  new Boolean(false)},
            {Simon, Smith,  Tennis,   new Integer(20), new Boolean(true)},
            {Paul,  Jones,  Rugby,    new Integer(10), new Boolean(false)}
        };

        JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500, 100));

        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        table.addMouseListener(new MouseListener(){
            public void mouseEntered(MouseEvent me){}
            public void mouseExited(MouseEvent me){}
            public void mouseReleased(MouseEvent me){}
            public void mouseClicked(MouseEvent me){}
            public void mousePressed(MouseEvent me){
                if (me.isControlDown()){
                    System.out.println(This is working );
                }
            }
        });

        InputMap inputMap = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);
        inputMap.put(keyStroke, none);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }

    private static void createAndShowGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame(TableTester);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TableTester newContentPane = new TableTester();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

mousePressed विधि में मैं मेज से सभी चयनित पंक्तियों के साथ चारों ओर हो रही खेला है, और फिर यदि नव क्लिक किया पंक्ति selectedRows में था की जांच करने के लिए जा रहा था ... लेकिन, मैं यकीन नहीं है अगर वहाँ के लिए एक रास्ता है देखें कि कौन-पंक्ति MouseEvent साथ जुड़ा हुआ है।

(इसके अलावा, मैं इस तरह बहुत ज्यादा के साथ चारों ओर नहीं खेला जाना चाहिए, क्योंकि अपेक्षित व्यवहार है, लेकिन यह कंपनी में एक पुराने सिस्टम को दोहराने के लिए है)

कोई भी विचार / सुझाव की सराहना की होगी!

12/03/2009 को 17:19
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
8

ठीक है, दूसरा ले (मैं पहले एक के रूप में यह कुछ अन्य उपयोग, जो जानते हैं कि के लिए किसी को पसंद आ सकता छोड़ दिया? कहो यह शैक्षिक उद्देश्य के लिए है ... :-))।

मैं JTable के स्रोत कोड पर एक नज़र था और पता चला कि माउस घटनाओं देखो द्वारा नियंत्रित किया और महसूस कर रहे हैं। यह जानते हुए कि यह कैसे नियंत्रण कुंजी संभालती है, मैं सुरक्षित रूप से आपको क्या चाहिए करने के लिए changeSelection विधि रद्द कर सकते थे।
मैं आवश्यकताओं थोड़ा अजीब (आप अभी भी शिफ्ट का उपयोग + क्लिक कर सकते हैं, नहीं?), लेकिन मैं नहीं जानता कि संदर्भ पाते हैं।

class SpecialTable extends JTable
{
    SpecialTable(Object[][] data, String[] columnNames)
    {
        super(data, columnNames);
// That's already the default        
//        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    }

    /**
     * Called by javax.swing.plaf.basic.BasicTableUI.Handler.adjustSelection(MouseEvent)
     * like: table.changeSelection(pressedRow, pressedCol, e.isControlDown(), e.isShiftDown());
     */
    @Override
    public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend)
    {
        if (toggle && !isRowSelected(rowIndex))
            return; // Don't do the selection
        super.changeSelection(rowIndex, columnIndex, toggle, extend);
    }
}

बहुत सरल है और वास्तव में आप क्या जरूरत है!

Btw, धन्यवाद इस तरह के सरल अच्छा परीक्षण का मामला प्रदान करने के लिए, मैं अगर मैं इसे अपने आप को लिखना पड़ा की कोशिश की हो सकता है नहीं ... :-D यह एक दिलचस्प और सीखने चुनौती थी।

13/03/2009 को 15:17
का स्रोत उपयोगकर्ता

वोट
1

मैं निम्नलिखित के साथ सफलता मिली है, हालांकि मुझे यकीन है कि सबसे अच्छा तरीका है नहीं कर रहा हूँ ...

class SpecialTable extends JTable
{
    boolean bIsControlDown;
    int clickedRow;

    SpecialTable(Object[][] data, String[] columnNames)
    {
        super(data, columnNames);
//        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        getSelectionModel().addListSelectionListener(this);
        addMouseListener(new MouseInputAdapter()
        {
            public void mousePressed(MouseEvent me)
            {
                bIsControlDown = me.isControlDown();
                clickedRow = rowAtPoint(me.getPoint());
            }
        });
    }

    public void valueChanged(ListSelectionEvent evt)  
    {
        super.valueChanged(evt);
        if (bIsControlDown)
        {
            if (!evt.getValueIsAdjusting())
            {
//                System.out.println(evt);
//                System.out.println("=> " + clickedRow);
                getSelectionModel().removeSelectionInterval(clickedRow, clickedRow);
            }
        }
    }
}

लाइनों को परिभाषित करने की जगह tableके साथ ही अपने कोड में:

    JTable table = new SpecialTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 100));

आप एक अचयनित पंक्ति को नियंत्रित क्लिक करते हैं, यह कुछ समय के लिए, चयन किया जाता है तो इसे नहीं चुना जाता।

12/03/2009 को 18:58
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more