2017-12-17 3 views
-1

Ich habe eine Weile damit herumgetüftelt, und alle Lösungen und Arbeitsbeispiele, die ich finden konnte, enthalten Kontrollkästchen, die mit den eingebauten booleschen TableCellRenderers gerendert wurden habe nur ein Kontrollkästchen. Ich habe kein funktionierendes Beispiel gefunden, bei dem neben der Checkbox in dieser SAME-Zelle Text vorhanden wäre, genauer gesagt eine JCheckBox, die ein Kontrollkästchen und einen Text zulässt.Einfügen von Text neben einer Checkbox in einer Jtable-Zelle

+0

Mit Verwendung von noch etwas anderes versuchen, Ich schlage vor, Sie beginnen mit [Verwenden von benutzerdefinierten Renderern] (https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer) – MadProgrammer

+0

Ich wäre auch daran interessiert zu wissen, warum Sie müssen Text, der mit einem Ankreuzfeld in einer Tabellenzelle verknüpft ist, da die Spaltenüberschrift (in den meisten Fällen) eine Beschreibung auf dem i ntent ... nur sagen – MadProgrammer

+0

Darüber hinaus könnten Sie eine andere Spalte verwenden, um den Text darzustellen – MadProgrammer

Antwort

1

Wenn Sie Ihre Daten/Anforderungen nicht innerhalb der Standard verfügbaren Funktionen passen Sie eine maßgeschneiderte Lösung

auf die Bereitstellung aussehen müssen würde ich empfehlen Sie bei Using custom renderers

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public class Data { 
     private String text; 
     private boolean selected; 

     public Data(String text, boolean selected) { 
      this.text = text; 
      this.selected = selected; 
     } 

     public String getText() { 
      return text; 
     } 

     public void setText(String text) { 
      this.text = text; 
     } 

     public boolean isSelected() { 
      return selected; 
     } 

     public void setSelected(boolean state) { 
      this.selected = state; 
     } 

    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      DefaultTableModel model = new DefaultTableModel(new String[] {"Something"}, 0) { 
       @Override 
       public Class<?> getColumnClass(int columnIndex) { 
        return Data.class; 
       } 
      }; 
      model.addRow(new Object[]{new Data("Hello", true)}); 
      model.addRow(new Object[]{new Data("Goodbye", false)}); 
      model.addRow(new Object[]{new Data("Do you want to play a game?", true)}); 
      model.addRow(new Object[]{new Data("Yesturday", false)}); 
      model.addRow(new Object[]{new Data("Tomorrow", true)}); 
      model.addRow(new Object[]{new Data("Java", false)}); 
      model.addRow(new Object[]{new Data("Swift", false)}); 
      model.addRow(new Object[]{new Data("Helicopter", true)}); 


      JTable table = new JTable(model); 
      table.setDefaultRenderer(Data.class, new DataTableCellRenderer()); 

      add(new JScrollPane(table)); 
     } 

    } 

    public class DataTableCellRenderer extends JCheckBox implements TableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      if (isSelected) { 
       setBackground(table.getSelectionBackground()); 
       setForeground(table.getSelectionForeground()); 
      } else { 
       setBackground(table.getBackground()); 
       setForeground(table.getForeground()); 
      } 

      if (value instanceof Data) { 
       Data data = (Data)value; 
       setText(data.getText()); 
       setSelected(data.isSelected()); 
      } 

      return this; 
     } 

    } 

} 
einen Blick zu beginnen, indem

An dieser Stelle ich frage mich, links, wenn JTable die beste Lösung und wenn JList ist vielleicht

natürlich eine andere Option besser sein, die mit JTable besser funktionieren könnte, würde ein benutzerdefiniertes TableModel zu entwickeln, die die Daten in separaten Spalten brechen könnte ...

Custom table model

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public class Data { 

     private String text; 
     private boolean selected; 

     public Data(String text, boolean selected) { 
      this.text = text; 
      this.selected = selected; 
     } 

     public String getText() { 
      return text; 
     } 

     public void setText(String text) { 
      this.text = text; 
     } 

     public boolean isSelected() { 
      return selected; 
     } 

     public void setSelected(boolean state) { 
      this.selected = state; 
     } 

    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      DataTableModel model = new DataTableModel(); 
      model.add(new Data("Hello", true)); 
      model.add(new Data("Goodbye", false)); 
      model.add(new Data("Do you want to play a game?", true)); 
      model.add(new Data("Yesturday", false)); 
      model.add(new Data("Tomorrow", true)); 
      model.add(new Data("Java", false)); 
      model.add(new Data("Swift", false)); 
      model.add(new Data("Helicopter", true)); 

      JTable table = new JTable(model); 

      add(new JScrollPane(table)); 
     } 

    } 

    public class DataTableModel extends AbstractTableModel { 

     private List<Data> rows = new ArrayList<>(25); 

     public void add(Data data) { 
      int rowCount = getRowCount(); 
      rows.add(data); 
      fireTableRowsInserted(rowCount, rowCount); 
     } 

     @Override 
     public String getColumnName(int column) { 
      switch (column) { 
       case 0: return ""; 
       case 1: return "Option"; 
      } 
      return null; 
     } 

     @Override 
     public int getRowCount() { 
      return rows.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      switch (columnIndex) { 
       case 0: return Boolean.class; 
       case 1: return String.class; 
      } 
      return Object.class; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      Data row = rows.get(rowIndex); 
      switch (columnIndex) { 
       case 0: return row.isSelected(); 
       case 1: return row.getText(); 
      } 
      return null; 
     } 



    } 

} 

IMHO, ist dies eine bessere Lösung für JTable

Verwandte Themen