상세 컨텐츠

본문 제목

java JTable panel based cell editor 관련, cell 안에 panel 넣기

JAVA/JAVA UI

by AlrepondTech 2020. 9. 15. 15:11

본문

반응형
728x170

 

 

 

=================================

=================================

=================================

 

 

 

I have a cell editor that contains a little button and then a textfield that can be used to edit the value inline

I use setSurrendersFocusOnKeystroke(true) and a focus listener in order to allow a user to start editing immediately from the keyboard, but the trouble is the fisrt key pressed seems to get consumed rather being added to the text field, how can I prevent this ?

Full self contained example below

import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

public class PanelTableEditorTest extends JFrame {

   
private JTable table;

   
public PanelTableEditorTest() {
       
this.setLayout(new BorderLayout());
        table
= new JTable(10, 10);
        table
.getSelectionModel().setSelectionMode(
           
ListSelectionModel.SINGLE_SELECTION);
        table
.setCellSelectionEnabled(true);
        table
.setDefaultEditor(Object.class, new SimpleMultiRowCellEditor());
        table
.setSurrendersFocusOnKeystroke(true);
        table
.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
           
.put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F2, 0),
           
"none");
        table
.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
           
.put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0),
           
"startEditing");
       
this.add(table.getTableHeader(), BorderLayout.NORTH);
       
this.add(table, BorderLayout.CENTER);
        pack
();
        setVisible
(true);
   
}

   
public static void main(String[] args) {
       
EventQueue.invokeLater(new Runnable() {

           
public void run() {
               
new PanelTableEditorTest();
           
}
       
});
   
}

   
public class SimpleMultiRowCellEditor extends DefaultCellEditor {

       
final JPanel panel;
       
private final JButton rowCount;

       
public SimpleMultiRowCellEditor() {
           
super(new JTextField());
           
this.setClickCountToStart(1);

            rowCount
= new JButton();
            rowCount
.setVisible(true);
            panel
= new JPanel();
            panel
.setOpaque(false);
            panel
.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
            panel
.add(rowCount);
            panel
.add(editorComponent);
            panel
.addFocusListener(new PanelFocusListener());
       
}

       
public Component getTableCellEditorComponent(
           
final JTable table,final Object val, final boolean isSelected,
           
final int row, final int column) {
            rowCount
.setText("1");
            delegate
.setValue(val);
            editorComponent
.requestFocusInWindow();
           
return panel;
       
}

       
class PanelFocusListener implements FocusListener {

           
public void focusGained(FocusEvent e) {
                editorComponent
.requestFocusInWindow();
           
}

           
public void focusLost(FocusEvent e) {
           
}
       
}
   
}
}

 

 

 

=================================

=================================

=================================

 

 



출처: http://www.esus.com/docs/GetQuestionPage.jsp?uid=1286

Chat with random people around the world, auto-translating languages! 

Courtesy of Nobuo Tamemasa (http://www2.gol.com/users/tame/swing/examples/JTableExamples1.html)


JRadioButtonTableExample.java:

//

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

class RadioButtonRenderer implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (value == null) 
            return null;
        
        return(Component)value;
    }
}
class RadioButtonEditor extends DefaultCellEditor
implements ItemListener {
    private JRadioButton button;
    public RadioButtonEditor(JCheckBox checkBox) {
        super(checkBox);
    }
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        if (value == null) 
            return null;
        
        button = (JRadioButton)value;
        button.addItemListener(this);
        return(Component)value;
    }
    public Object getCellEditorValue() {
        button.removeItemListener(this);
        return button;
    }
    public void itemStateChanged(ItemEvent e) {
        super.fireEditingStopped();
    }
}
public class JRadioButtonTableExample extends JFrame {
    public JRadioButtonTableExample() {
        super("JRadioButtonTable Example");
        UIDefaults ui = UIManager.getLookAndFeel().getDefaults();
        UIManager.put("RadioButton.focus", ui.getColor("control"));
        DefaultTableModel dm = new DefaultTableModel();
        dm.setDataVector(new Object[][]{
            {
                "Group 1",
                new JRadioButton("A")
            },
            {
                "Group 1",
                new JRadioButton("B")
            },
            {
                "Group 1",
                new JRadioButton("C")
            },
            {
                "Group 2",
                new JRadioButton("a")
            }, {
                "Group 2",
                new JRadioButton("b")
            }
        }, new Object[]{"String", "JRadioButton"});
        JTable table = new JTable(dm) {
            public void tableChanged(TableModelEvent e) {
                super.tableChanged(e);
                repaint();
            }
        };
        ButtonGroup group1 = new ButtonGroup();
        group1.add((JRadioButton)dm.getValueAt(0, 1));
        group1.add((JRadioButton)dm.getValueAt(1, 1));
        group1.add((JRadioButton)dm.getValueAt(2, 1));
        ButtonGroup group2 = new ButtonGroup();
        group2.add((JRadioButton)dm.getValueAt(3, 1));
        group2.add((JRadioButton)dm.getValueAt(4, 1));
        table.getColumn("JRadioButton").setCellRenderer(new RadioButtonRenderer());
        table.getColumn("JRadioButton").setCellEditor(new RadioButtonEditor(new JCheckBox()));
        JScrollPane scroll = new JScrollPane(table);
        getContentPane().add(scroll);
        setSize(200, 140);
        setVisible(true);
    }
    public static void main(String[] args) {
        JRadioButtonTableExample frame = new JRadioButtonTableExample();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//




JRadioButtonTableExample2.java:

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


/**

 * @version 1.2 08/13/99

 */
public class JRadioButtonTableExample2 extends JFrame {
    public JRadioButtonTableExample2() {
        super("JRadioButtonTable Example");
        DefaultTableModel dm = new DefaultTableModel();
        dm.setDataVector(new Object[][]{
            {
                "1",
                new Integer(-1)
            },
            {
                "2",
                new Integer(-1)
            },
            {
                "3",
                new Integer(0)
            },
            {
                "4",
                new Integer(1)
            }, {
                "5",
                new Integer(2)
            }
        }, new Object[]{"Question", "Answer"});
        JTable table = new JTable(dm);
        String[] answer = {
            "A",
            "B",
            "C"
        };
        table.getColumn("Answer").setCellRenderer(new RadioButtonRenderer(answer));
        table.getColumn("Answer").setCellEditor(new RadioButtonEditor(new JCheckBox(), new RadioButtonPanel(answer)));
        JScrollPane scroll = new JScrollPane(table);
        getContentPane().add(scroll);
    }
    // Cell base
    class RadioButtonPanel extends JPanel {
        JRadioButton [] buttons;
        RadioButtonPanel(String[] str) {
            setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
            buttons = new JRadioButton[str.length];
            for (int i = 0; i < buttons.length; i ++) {
                buttons[i] = new JRadioButton(str[i]);
                buttons[i].setFocusPainted(false);
                add(buttons[i]);
            }
        }
        public void setSelectedIndex(int index) {
            for (int i = 0; i < buttons.length; i ++) {
                buttons[i].setSelected(i == index);
            }
        }
        public int getSelectedIndex() {
            for (int i = 0; i < buttons.length; i ++) {
                if (buttons[i].isSelected()) {
                    return i;
                }
            }
            return -1;
        }
        public JRadioButton[] getButtons() {
            return buttons;
        }
    }
    class RadioButtonRenderer extends RadioButtonPanel implements TableCellRenderer {
        RadioButtonRenderer(String[] strs) {
            super(strs);
        }
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Integer) {
                setSelectedIndex(((Integer)value).intValue());
            }
            return this;
        }
    }
    class RadioButtonEditor extends DefaultCellEditor implements ItemListener {
        RadioButtonPanel panel;
        public RadioButtonEditor(JCheckBox checkBox, RadioButtonPanel panel) {
            super(checkBox);
            this.panel = panel;
            ButtonGroup buttonGroup = new ButtonGroup();
            JRadioButton[] buttons = panel.getButtons();
            for (int i = 0; i < buttons.length; i ++) {
                buttonGroup.add(buttons[i]);
                buttons[i].addItemListener(this);
            }
        }
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value instanceof Integer) {
                panel.setSelectedIndex(((Integer)value).intValue());
            }
            return panel;
        }
        public Object getCellEditorValue() {
            return new Integer(panel.getSelectedIndex());
        }
        public void itemStateChanged(ItemEvent e) {
            super.fireEditingStopped();
        }
    }
    public static void main(String[] args) {
        JRadioButtonTableExample2 frame = new JRadioButtonTableExample2();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.setSize(230, 140);
        frame.setVisible(true);
    }
}

 

 

 

=================================

=================================

=================================

 

 

반응형
그리드형


관련글 더보기

댓글 영역