在Jtable单元格中的复选框旁边插入文本 [英] Inserting text alongside a checkbox in a Jtable cell
问题描述
我已经习惯了这一段时间了,我能找到的所有解决方案和工作示例都包含使用内置布尔TableCellRenderers呈现的复选框,即一个单元格只能有一个复选框。我没有找到任何工作示例,其中在该SAME单元格中的复选框旁边会有一些文本,或者更具体地说是允许复选框和文本的JCheckBox。
当您的数据/要求不符合默认的可用功能时,您需要考虑提供自定义解决方案
我建议您首先查看
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 static void main(String [] args){
new Test();
}
公共类数据{
私有字符串文本;选择
私有布尔值;
public Data(String text,boolean selected){
this.text = text;
this.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);
}
});
}
公共类TestPane扩展JPanel {
public TestPane(){
setLayout(new BorderLayout());
DataTableModel model = new DataTableModel();
model.add(new Data(Hello,true));
model.add(new Data(Goodbye,false));
model.add(新数据(你想玩游戏吗?,真));
model.add(新数据(Yesturday,false));
model.add(新数据(明天,真实));
model.add(new Data(Java,false));
model.add(new Data(Swift,false));
model.add(新数据(直升机,真));
JTable table = new JTable(model);
add(new JScrollPane(table));
}
}
公共类DataTableModel扩展AbstractTableModel {
private List< Data> rows = new ArrayList<>(25);
public void add(数据数据){
int rowCount = getRowCount();
rows.add(data);
fireTableRowsInserted(rowCount,rowCount);
}
@Override
public String getColumnName(int column){
switch(column){
case 0:return;
案例1:返回选项;
}
返回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;
}
返回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();
}
返回null;
}
}
}
恕我直言,这是一个更好的解决方案,使用 JTable
I have been fiddling around with this for a while, and all the solutions and working examples I could find included check boxes rendered using the built-in Boolean TableCellRenderers, that is a cell could have only a check box. I didn't find any working example where there would be some text alongside that check box in that SAME cell, or more specifically a JCheckBox which allows a check box and a text.
When your data/requirements doesn't fit within the default available functionality, you need to look towards providing a customised solution
I'd recommend you start by having a look at 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;
}
}
}
At this point, I'm left wondering if JTable
is the best solution and if JList
might be better
Of course, another option, which might work better with JTable
, would be to devise a custom TableModel
which could break down the data into separate columns...
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, this is a better solution for using JTable
这篇关于在Jtable单元格中的复选框旁边插入文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!