Java 将jCheckBox设置为在jTable中不可见
我有一个带有两列的Java 将jCheckBox设置为在jTable中不可见,java,swing,netbeans,jtable,tablecellrenderer,Java,Swing,Netbeans,Jtable,Tablecellrenderer,我有一个带有两列的jTable。第一列被设置为布尔值(用于复选框),第二列有字符串值。由于我使用Netbeans,复选框被添加到第一列的所有行中。我试图只为第二列中有值的行添加它。我用代码试过了 private class CustomCellRenderer extends DefaultTableCellRenderer { /* (non-Javadoc) * @see javax.swing.table.DefaultTableCellRenderer#getTableCel
jTable
。第一列被设置为布尔值(用于复选框),第二列有字符串值。由于我使用Netbeans
,复选框被添加到第一列的所有行中。我试图只为第二列中有值的行添加它。我用代码试过了
private class CustomCellRenderer extends DefaultTableCellRenderer {
/* (non-Javadoc)
* @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
Component rendererComp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column);
for(int i=row;i<jTable1.getRowCount();i++){
if(jTable1.getValueAt(i, 1)==null){
jTable1.setValueAt(true, i, 0);
//checkbox.setOpaque(false);
}
}
return this ;
}
}
私有类CustomCellRenderer扩展了DefaultTableCellRenderer{
/*(非Javadoc)
*@see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,java.lang.Object,boolean,boolean,int,int)
*/
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
Component RenderComp=super.GetTableCellRenderComponent(表、值、isSelected、hasFocus、行、列);
for(int i=row;iTableCellRenderer在表中用于绘制重用同一组件的表的各个单元格。该表自动设置适当的上下文、组件边界,并为需要绘制的表的每个单元格调用GetTableCellRenderComponent
(第一次显示表格时,所有可见单元格都会被绘制,然后在收到TableModel通知后,相应的单元格会被重新绘制)
因此,在TableCellRender中,您当然不需要迭代表中的单元格来设置值。这根本没有意义。请记住,您正在实现接口TableCellRender
,该接口有一个您需要遵守的契约
从Javadoc:
返回用于绘制单元格的组件。使用此方法
在绘制之前适当配置渲染器
因此,您只需返回一个正确表示值
参数的组件。可能的话,您可以修改该组件以指示单元格是否具有焦点,以及当前是否选中了该单元格。仅此而已
现在,来回答您的问题:如果您只想为具有值的行显示复选框,请实现TableCellRenderer,返回复选框并根据第1列(第二列)中的值修改其可见性
这个例子很有效:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
public class TestTable {
public class CheckboxCellRenderer extends JPanel implements TableCellRenderer {
private JCheckBox checkBox;
public CheckboxCellRenderer() {
super(new FlowLayout(FlowLayout.CENTER, 0, 0));
setOpaque(false);
checkBox = new JCheckBox();
checkBox.setOpaque(false);
checkBox.setHorizontalAlignment(JCheckBox.CENTER);
add(checkBox);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Object valueInColumn1 = table.getValueAt(row, 1);
checkBox.setVisible(valueInColumn1 != null);
checkBox.setSelected(value instanceof Boolean && (Boolean) value);
return this;
}
}
private JFrame f;
private JTable table;
private class MyObject {
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private String value;
private boolean selected;
public MyObject(String value) {
this.value = value;
}
public PropertyChangeSupport getPropertyChangeSupport() {
return propertyChangeSupport;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
propertyChangeSupport.firePropertyChange("value", null, value);
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
if (this.selected != selected) {
this.selected = selected;
propertyChangeSupport.firePropertyChange("selected", !selected, selected);
}
}
}
protected void initUI() {
List<MyObject> objects = new ArrayList<TestTable.MyObject>();
for (int i = 0; i < 200; i++) {
MyObject object = new MyObject(i % 3 == 1 ? null : "Row " + (i + 1));
objects.add(object);
}
table = new JTable(new MyTableModel(objects));
table.setRowHeight(20);
table.getColumnModel().getColumn(0).setCellRenderer(new CheckboxCellRenderer());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(table), BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public class MyTableModel extends AbstractTableModel implements PropertyChangeListener {
private List<MyObject> objects;
public MyTableModel(List<MyObject> objects) {
super();
this.objects = objects;
for (MyObject object : objects) {
object.getPropertyChangeSupport().addPropertyChangeListener(this);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getSource() instanceof MyObject) {
int index = objects.indexOf(evt.getSource());
fireTableRowsUpdated(index, index);
}
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return objects.size();
}
public MyObject getValueAt(int row) {
return objects.get(row);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return getValueAt(rowIndex).isSelected();
case 1:
return getValueAt(rowIndex).getValue();
}
return null;
}
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
getValueAt(rowIndex).setSelected(Boolean.TRUE.equals(value));
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0 && getValueAt(rowIndex).getValue() != null;
}
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return Boolean.class;
case 1:
return String.class;
}
return Object.class;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Selected";
case 1:
return "Value";
}
return null;
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.FlowLayout;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.beans.PropertyChangeSupport;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableCellRenderer;
公共类测试表{
公共类CheckboxCellRenderer扩展JPanel实现TableCellRenderer{
私有JCheckBox复选框;
公共CheckboxCellRenderer(){
super(新的FlowLayout(FlowLayout.CENTER,0,0));
设置不透明(假);
复选框=新的JCheckBox();
复选框.setOpaque(false);
复选框.setHorizontalAlignment(JCheckBox.CENTER);
添加(复选框);
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
Object valueInColumn1=table.getValueAt(第1行);
checkBox.setVisible(valueInColumn1!=null);
复选框.setSelected(布尔值和(布尔)值的值实例);
归还这个;
}
}
私有jf框架;
专用JTable表;
私有类MyObject{
私有属性更改支持属性更改支持=新属性更改支持(此);
私有字符串值;
选择私有布尔值;
公共MyObject(字符串值){
这个值=值;
}
公共属性更改支持getPropertyChangeSupport(){
返回属性更改支持;
}
公共字符串getValue(){
返回值;
}
公共void设置值(字符串值){
这个值=值;
FirePropertyChangeSupport.firePropertyChange(“值”,null,值);
}
公选{
返回选中的;
}
已选择公共无效设置(已选择布尔值){
如果(this.selected!=选中){
this.selected=selected;
propertyChangeSupport.firePropertyChange(“选定的”,!选定的,选定的);
}
}
}
受保护的void initUI(){
列表对象=新的ArrayList();
对于(int i=0;i<200;i++){
MyObject对象=新的MyObject(i%3==1?空:“行”+(i+1));
对象。添加(对象);
}
table=新的JTable(新的MyTableModel(objects));
表2.设置行高(20);
table.getColumnModel().getColumn(0).setCellRenderer(新的CheckboxCellRenderer());
f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(新的JScrollPane(表),BorderLayout.CENTER);
f、 包装();
f、 setVisible(真);
}
公共类MyTableModel扩展了AbstractTableModel,实现了PropertyChangeListener{
私有列表对象;
公共MyTableModel(列出对象){
超级();
this.objects=对象;
用于(MyObject对象:对象){
object.getPropertyChangeSupport().addPropertyChangeListener(此);
}
}
@凌驾
公共作废属性更改(属性更改事件evt){
if(MyObject的evt.getSource()实例){
int index=objects.indexOf(evt.getSource());
冷杉
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
public class TestTable {
public class CheckboxCellRenderer extends JPanel implements TableCellRenderer {
private JCheckBox checkBox;
public CheckboxCellRenderer() {
super(new FlowLayout(FlowLayout.CENTER, 0, 0));
setOpaque(false);
checkBox = new JCheckBox();
checkBox.setOpaque(false);
checkBox.setHorizontalAlignment(JCheckBox.CENTER);
add(checkBox);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Object valueInColumn1 = table.getValueAt(row, 1);
checkBox.setVisible(valueInColumn1 != null);
checkBox.setSelected(value instanceof Boolean && (Boolean) value);
return this;
}
}
private JFrame f;
private JTable table;
private class MyObject {
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private String value;
private boolean selected;
public MyObject(String value) {
this.value = value;
}
public PropertyChangeSupport getPropertyChangeSupport() {
return propertyChangeSupport;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
propertyChangeSupport.firePropertyChange("value", null, value);
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
if (this.selected != selected) {
this.selected = selected;
propertyChangeSupport.firePropertyChange("selected", !selected, selected);
}
}
}
protected void initUI() {
List<MyObject> objects = new ArrayList<TestTable.MyObject>();
for (int i = 0; i < 200; i++) {
MyObject object = new MyObject(i % 3 == 1 ? null : "Row " + (i + 1));
objects.add(object);
}
table = new JTable(new MyTableModel(objects));
table.setRowHeight(20);
table.getColumnModel().getColumn(0).setCellRenderer(new CheckboxCellRenderer());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(table), BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public class MyTableModel extends AbstractTableModel implements PropertyChangeListener {
private List<MyObject> objects;
public MyTableModel(List<MyObject> objects) {
super();
this.objects = objects;
for (MyObject object : objects) {
object.getPropertyChangeSupport().addPropertyChangeListener(this);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getSource() instanceof MyObject) {
int index = objects.indexOf(evt.getSource());
fireTableRowsUpdated(index, index);
}
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return objects.size();
}
public MyObject getValueAt(int row) {
return objects.get(row);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return getValueAt(rowIndex).isSelected();
case 1:
return getValueAt(rowIndex).getValue();
}
return null;
}
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
getValueAt(rowIndex).setSelected(Boolean.TRUE.equals(value));
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0 && getValueAt(rowIndex).getValue() != null;
}
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return Boolean.class;
case 1:
return String.class;
}
return Object.class;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Selected";
case 1:
return "Value";
}
return null;
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
}
public class CompoundRenderer implements TableCellRenderer {
TableCellRenderer booleanRenderer;
TableCellRenderer defaultRenderer;
public CompoundRenderer(TableCellRenderer booleanRenderer,
TableCellRenderer defaultRenderer) {
this.booleanRenderer = booleanRenderer;
this.defaultRenderer = defaultRenderer;
}
@Override
public Component getTableCellRendererComponent(..., Object value, ....) {
if (value instanceof Boolean) {
return booleanRenderer.getTableCellRendererComponent(...);
}
return defaultRenderer.getTableCellRendererComponent(...);
}
}
// usage
JTable myTable ...
TableCellRenderer compound = new CompoundRenderer(
myTable.getDefaultRenderer(Boolean.class), myTable.getDefaultRenderer(Object.class));
// either register for all booleans
myTable.setDefaultRenderer(Boolean.class, compound);
// or register for a particular column
myTable.getColumnModel().getColumn(someIndex).setCellRenderer(compound);
public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
CheckBoxRenderer() {
setHorizontalAlignment(JLabel.CENTER);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Object valueInColumn1 = table.getValueAt(row, 1);
if (valueInColumn1 == null) {
JLabel x=new JLabel();
return x;
}
setSelected((value != null && ((Boolean) value).booleanValue()));
return this;
}
}
paramTable.getColumnModel().getColumn(3).setCellRenderer(new CheckBoxRenderer());
public class CheckBoxEditor extends DefaultCellEditor
{
private JCheckBox checkBox = new JCheckBox();
CheckBoxEditor()
{
super( checkBox );
}
@Override
public Component getTableCellEditorComponent(
JTable table,
Object value,
boolean isSelected,
int row,
int column )
{
if ( row != 1 )
{
return super.getTableCellEditorComponent(
table, value, isSelected, row, column );
}
else
{
return null;
}
}
}
paramTable.getColumnModel().getColumn(3).setCellEditor( new CheckBoxEditor() );
x.setOpaque( true );
x.setBackground( MYCOLOR );