/ / केवल एक JTable सेल में चेकबॉक्स - जावा, स्विंग, जिबेट, जेसीचबॉक्स

केवल एक जेटीबल सेल - जावा, स्विंग, जेटेबल, जेकेकबॉक्स में चेकबॉक्स

मैं एक बनाना चाहता हूँ JTable 2 कॉलम के साथ, जो एक सर्वेक्षण की तरह दिखता है। तो बाईं ओर सवाल हैं और दाईं ओर उपयोगकर्ता अपने जवाब दे सकता है। लेकिन एक पंक्ति में दाईं ओर एक चेकबॉक्स होना चाहिए, ताकि उपयोगकर्ता केवल हां या ना में उत्तर दे सके।

क्या ऐसा करना संभव है JTable, और मैं इसे कैसे प्राप्त कर सकता हूं?

सादर

उत्तर:

उत्तर № 1 के लिए 1

आपने एक टिप्पणी में कहा है:

मैंने इसे JCheckboxes के एक कॉलम के साथ आज़माया, यह काम करता है, लेकिन मैं इसे अभी चाहता हूँ एक सेल

ध्यान दें यह आवश्यकता थोड़ी मुश्किल है। मुझे लगता है कि आप ओवरराइड कर सकते हैं getCellRenderer (इंट पंक्ति, इंट कॉलम) तथा getCellEditor (इंट पंक्ति, इंट कॉलम) कक्ष मान के लिए पूछ रहे तरीके "वर्ग।

इस तरह सेल रेंडर / एडिटर एक होगा JCheckbox तब भी जब तालिका की पंक्तियों को क्रमबद्ध किया जाता है या तालिका के स्तंभों को पुन: व्यवस्थित किया जाता है।

कुछ इस तरह:

    JTable table = new JTable(model) {
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
if(getValueAt(row, column) instanceof Boolean) {
return super.getDefaultRenderer(Boolean.class);
} else {
return super.getCellRenderer(row, column);
}
}

@Override
public TableCellEditor getCellEditor(int row, int column) {
if(getValueAt(row, column) instanceof Boolean) {
return super.getDefaultEditor(Boolean.class);
} else {
return super.getCellEditor(row, column);
}
}
};

उदाहरण

यहाँ एक पूर्ण उदाहरण के साथ खेलने के लिए।

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class Demo {

private void createAndShowGUI() {

DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0);
model.addRow(new Object[]{"Property # 1", "Value # 1"});
model.addRow(new Object[]{"Property # 2", Boolean.TRUE});
model.addRow(new Object[]{"Property # 3", "Value # 3"});

JTable table = new JTable(model) {
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
if(getValueAt(row, column) instanceof Boolean) {
return super.getDefaultRenderer(Boolean.class);
} else {
return super.getCellRenderer(row, column);
}
}

@Override
public TableCellEditor getCellEditor(int row, int column) {
if(getValueAt(row, column) instanceof Boolean) {
return super.getDefaultEditor(Boolean.class);
} else {
return super.getCellEditor(row, column);
}
}
};
table.setAutoCreateRowSorter(true);

JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

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

स्क्रीनशॉट

यहां छवि विवरण दर्ज करें


उत्तर № 2 के लिए 1

आप इंटरफ़ेस TableCellRenderer को लागू कर सकते हैंJTextField और JLabel की तरह अलग-अलग ऑब्जेक्ट्स के लिए कस्टम रेंडर बनाने के लिए। आपको विधि getTableCellRendererComponent को लागू करना होगा और इसमें से आप एक घटक (जैसे JPanel या जो आप चाहें) को उन घटकों के साथ वापस कर सकते हैं जिन्हें आप सेल पर दिखाना चाहते हैं। तालिका में, आप JTable.setDefaultRenderer () का उपयोग कस्टम वर्ग के लिए अपना नया रेंडरर सेट करने के लिए करेंगे।

यदि आपके पास केवल 2 मान हैं, तो शायद आप अपने डेटा को बूलियन मानों पर सेट कर सकते हैं और तालिका को चेकबॉक्स (डिफ़ॉल्ट रेंडरिंग) के रूप में प्रदर्शित कर सकते हैं।

यह दूसरी विधि के लिए कोड है, जो आपको जैसा चाहिए वैसा ही अधिक लगता है।

class CheckBoxModel extends AbstractTableModel{

private final Object[][] rowData = {{"John" , true}, {"Mary", false}};
final String columnNames[] = { "Student", "Approve" };

@Override
public int getRowCount() {
return rowData.length;
}

@Override
public int getColumnCount() {
return columnNames.length;
}

@Override
public Class<?> getColumnClass(final int columnIndex) {
if (columnIndex == 1) {
return Boolean.class; //renders column as a CheckBox
}
return super.getColumnClass(columnIndex);
}

@Override
public Object getValueAt(final int rowIndex, final int columnIndex) {
return rowData[rowIndex][columnIndex];
}

@Override
public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
rowData[rowIndex][columnIndex] = aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}

@Override
public boolean isCellEditable(final int rowIndex, final int columnIndex) {
return true;    //makes all cells editable
}
}

और एक परीक्षण वर्ग:

public class TestTable {

public static void main(String[] args) {
final JFrame frame = new JFrame("Editable Color Table");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable(new CheckBoxModel());
final JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(500, 500);
frame.setVisible(true);
}
}