Я создал класс CheckCombo, который является наследником класса JComboBox: Код | import java.util.Vector;
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import java.awt.Dimension;
public class CheckCombo extends JComboBox { static class MyCheckBoxUI extends BasicCheckBoxUI { public static ComponentUI createUI(JComponent c) { return new MyCheckBoxUI(); } }
CheckComboRenderer renderer; public CheckCombo() { // TODO Auto-generated constructor stub renderer = new CheckComboRenderer(); setRenderer(renderer); addActionListener(this); setVisible(true); setEnabled(true); }
public CheckCombo(ComboBoxModel aModel) { super(aModel); initialize(); // TODO Auto-generated constructor stub renderer = new CheckComboRenderer(); setRenderer(renderer); addActionListener(this); setVisible(true); setEnabled(true); }
public CheckCombo(Object[] items) { super(items); initialize(); // TODO Auto-generated constructor stub renderer = new CheckComboRenderer(); setRenderer(renderer); addActionListener(this); setVisible(true); setEnabled(true); }
public CheckCombo(Vector<?> items) { super(items); initialize(); // TODO Auto-generated constructor stub renderer = new CheckComboRenderer(); setRenderer(renderer); addActionListener(this); setVisible(true); setEnabled(true); }
class CheckComboRenderer implements ListCellRenderer { JCheckBox checkBox; public CheckComboRenderer() { checkBox = new JCheckBox(); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JCheckBox checkBox = (JCheckBox)value; checkBox.setUI((BasicCheckBoxUI)MyCheckBoxUI.createUI(checkBox)); return checkBox; } }
/** * This method initializes this * */ private void initialize() { //this.setSize(new Dimension(124, 20)); //this.setPreferredSize(new Dimension(124, 20)); } } // @jve:decl-index=0:visual-constraint="10,10"
|
Инициализация комбобокса mycombo в основном файле программы, который помещается на панель: Код | private CheckCombo getCombo() { if (mycombo == null) { String s1, s2, s3; mycombo = new CheckCombo(); mycombo.setBounds(new Rectangle(933, 434, 124, 20)); } return mycombo; }
|
В основном коде программы--происходит выбор значений поля S_INF (текстовое поле) из таблицы VEC_CAT, а каждое выбранное значение (строка) помещается в чекбокс, который потом помещается в комбобокс mycombo Код | try { sval = String.valueOf(id_ko); statement4 = connection.createStatement(); sqlString = "SELECT DISTINCT Epoch FROM VEC_CAT WHERE ID_KO="+sval+" ORDER BY Epoch ASC"; resultSet4 = statement4.executeQuery(sqlString); resultSet4.next(); timestamp = resultSet4.getTimestamp("Epoch"); tslong = timestamp.getTime(); tslong += 10800000; timestamp.setTime(tslong); s = timestamp.toString(); s = s.trim(); ind = s.indexOf(" "); s1 = s.substring(0, ind); s1 = s1.replaceAll(",", "."); s2 = s.substring(ind+1); s2 = s2.replaceAll(",", "."); s2 = s2.substring(0, 8); jTextField1.setText(s1); // дата начала jTextField2.setText(s2); // время начала sqlString = "SELECT DISTINCT Epoch FROM VEC_CAT WHERE ID_KO="+sval+" ORDER BY Epoch DESC"; resultSet4 = statement4.executeQuery(sqlString); resultSet4.next(); timestamp = resultSet4.getTimestamp("Epoch"); tslong = timestamp.getTime(); tslong += 10800000; timestamp.setTime(tslong); s = timestamp.toString(); s = s.trim(); ind = s.indexOf(" "); s1 = s.substring(0, ind); s1 = s1.replaceAll(",", "."); s2 = s.substring(ind+1); s2 = s2.replaceAll(",", "."); s2 = s2.substring(0, 8); jTextField3.setText(s1); // дата конца jTextField4.setText(s2); // время конца resultSet4.close(); statement4.close(); jComboBox.setSelectedIndex(1); // sval = String.valueOf(id_ko); mycombo.removeAll(); statement3 = connection.createStatement(); //sqlString = "SELECT DISTINCT S_INF FROM VEC_CAT WHERE ID_KO="+sval; sqlString = "SELECT DISTINCT S_INF FROM VEC_CAT"; resultSet3 = statement3.executeQuery(sqlString); int countitem = 0; while (resultSet3.next()) { if (resultSet3.getObject(1)!=null) { s = resultSet3.getString(1); s = s.trim(); if (s.compareTo("")!=0) { chbmi = new JCheckBox(s); chbmi.setSize(124, 20); chbmi.setPreferredSize(new Dimension(124, 20)); chbmi.setVisible(true); chbmi.setEnabled(true); //mycombo.add(chbmi); mycombo.addItem(chbmi); countitem++; } } else { s = ""; } } resultSet3.close(); statement3.close(); mycombo.setVisible(true); mycombo.setEnabled(true); } catch (Exception e33) { exceptionString = e33.toString(); exceptionWarning = new ExceptionWarning(null); exceptionWarning.setWarning(exceptionString); exceptionWarning.setVisible(true); jTextField.setText(""); return; } cardLayout1.show(jPanel1, "jPanel6"); countPanel++;
|
В результате выдались сообщения об ошибках на консоль: Цитата | Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String at CheckCombo$CheckComboRenderer.getListCellRendererComponent(CheckCombo.java:71) at javax.swing.plaf.basic.BasicComboBoxUI.paintCurrentValue(BasicComboBoxUI.java:1059) at javax.swing.plaf.metal.MetalComboBoxUI.paintCurrentValue(MetalComboBoxUI.java:66) at javax.swing.plaf.basic.BasicComboBoxUI.paint(BasicComboBoxUI.java:850) at javax.swing.plaf.metal.MetalComboBoxUI.paint(MetalComboBoxUI.java:45) at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142) at javax.swing.JComponent.paintComponent(JComponent.java:743) at javax.swing.JComponent.paint(JComponent.java:1006) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4972) at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4925) at javax.swing.JComponent._paintImmediately(JComponent.java:4868) at javax.swing.JComponent.paintImmediately(JComponent.java:4675) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:451) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:114) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:461) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149) at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
|
То есть программе не нравится функция getListCellRendererComponent. В чём причина этого? Как мне исправить ошибку, чтобы у меня на панель окна приложения выводился комбобокс, содержащий чекбоксы с текстами? И должны ли этот комбобокс и чексбоксы, находящиеся в нём, иметь одинаковый размер (в моём случае это (124, 20) ), или же они могут иметь разный размер--например, комбобокс имеет немного больший размер, чем содержащиеся внутри него чекбоксы?
|