所以riffing什么安德鲁·汤普森说,你可以显示和一个JTable中改变你的标准,因为你似乎是想要创建和显示表格数据,数据可以随程序运行并受用户控制而改变。虽然这样做会带来一些挑战,因为好处与损失似乎是互补的属性,这意味着如果一个是真的,另一个必须是假的,并且这最容易用单个布尔表示,但是接下来如何连接JTable及其模型如果一行数据包含单个布尔值,以及如何允许用户更改这些属性,然后在两列中显示更改,那么它将显示两个属性?
因此,在创建表模型之前,我首先创建了一个类MyCriterion来表示一行数据。它有两个字段,一个名称字符串和一个有益的布尔值。再次,如果有利的话,则JTable的“效益”栏应显示一个复选标记,“损失”栏应该为空,反之亦然。类:
public class MyCriterion {
private String name;
private boolean beneficial;
public MyCriterion(String name) {
this(name, false);
}
public MyCriterion(String name, boolean beneficial) {
this.name = name;
this.beneficial = beneficial;
}
public String getName() {
return name;
}
public boolean isBeneficial() {
return beneficial;
}
public void setBeneficial(boolean beneficial) {
this.beneficial = beneficial;
}
@Override
public String toString() {
return "MyCriterion [name=" + name + ", beneficial=" + beneficial + "]";
}
}
接下来,表格模型,因为它是非常容易扩展的DefaultTableModel,比它扩展AbstractTableModel的,这是我决定的事,但同样,给它3列,最后两个依赖单个boolan的状态,MyCriterion的beneficial
字段。我“硬编码”列标题:
public static final String[] COLUMN_NAMES = { "Type of Criteria", "Benefit", "Loss" };
,并通过他们进入超类的构造函数的头一个数组和行数的int,并且初始行数当然是0
的:
public CriteriaTableModel() {
super(COLUMN_NAMES, 0);
}
的getColumnClass(int columnIndex)
应该返回String.class
如果器的columnIndex为0,否则将返回一个Boolean.class
,而这样做会让JTable中作为JCheckBoxes显示最后两个值。这并不像将它们显示为JRadioButton那样干净,但它很简单并且很有效。
我给模型一个public void addCriterion(MyCriterion myCriterion)
方法,使添加一行变得很简单。它增加了一个MyCriterion值进入超级模型到第0列:
public void addCriterion(MyCriterion myCriterion) {
super.addRow(new MyCriterion[] {myCriterion});
}
这意味着,该表的模型,这是由超级举行的真正的“核”,其实是有一列模型,一个持有MyCriterion
对象,所以我不得不重写setValue(...)
和getValueAt(...)
方法,这个单一数据列转换为显示器的3列:
@Override
public void setValueAt(Object aValue, int row, int column) {
MyCriterion myCriterion = (MyCriterion) super.getValueAt(row, 0);
boolean boolValue = (boolean) aValue;
switch (column) {
case 1:
myCriterion.setBeneficial(boolValue);
break;
case 2:
myCriterion.setBeneficial(!boolValue);
default:
break;
}
super.setValueAt(myCriterion, row, 0);
fireTableRowsUpdated(row, row);
}
@Override
public Object getValueAt(int row, int column) {
MyCriterion myCriterion = (MyCriterion) super.getValueAt(row, 0);
switch (column) {
case 0:
return myCriterion.getName();
case 1:
return myCriterion.isBeneficial();
case 2:
return !myCriterion.isBeneficial();
default:
String text = "Invalid column: " + column;
throw new IllegalArgumentException(text);
}
}
public MyCriterion getValueAt(int row) {
return (MyCriterion) super.getValueAt(row, 0);
}
我的整个表模型类:
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;
public @SuppressWarnings("serial")
class CriteriaTableModel extends DefaultTableModel {
public static final String[] COLUMN_NAMES = { "Type of Criteria", "Benefit", "Loss" };
public CriteriaTableModel() {
super(COLUMN_NAMES, 0);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return String.class;
default:
return Boolean.class;
}
}
public void addCriterion(MyCriterion myCriterion) {
super.addRow(new MyCriterion[] {myCriterion});
}
@Override
public void setValueAt(Object aValue, int row, int column) {
MyCriterion myCriterion = (MyCriterion) super.getValueAt(row, 0);
boolean boolValue = (boolean) aValue;
switch (column) {
case 1:
myCriterion.setBeneficial(boolValue);
break;
case 2:
myCriterion.setBeneficial(!boolValue);
default:
break;
}
super.setValueAt(myCriterion, row, 0);
fireTableRowsUpdated(row, row);
}
@Override
public boolean isCellEditable(int row, int column) {
return column > 0;
}
@Override
public Object getValueAt(int row, int column) {
MyCriterion myCriterion = (MyCriterion) super.getValueAt(row, 0);
switch (column) {
case 0:
return myCriterion.getName();
case 1:
return myCriterion.isBeneficial();
case 2:
return !myCriterion.isBeneficial();
default:
String text = "Invalid column: " + column;
throw new IllegalArgumentException(text);
}
}
public MyCriterion getValueAt(int row) {
return (MyCriterion) super.getValueAt(row, 0);
}
public List<MyCriterion> getCriteria() {
List<MyCriterion> criteriaList = new ArrayList<>();
for (int i = 0; i < getRowCount(); i++) {
criteriaList.add(getValueAt(i));
}
return criteriaList;
}
}
最后GUI来显示所有这一点,并有按钮,允许从JTable的添加和移除列:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class CriteriaList extends JPanel {
private CriteriaTableModel myModel = new CriteriaTableModel();
private JTable criteriaTable = new JTable(myModel);
private JTextField criterionNameField = new JTextField(10);
private JCheckBox beneficialCB = new JCheckBox("Beneficial");
public CriteriaList() {
criteriaTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myModel.addCriterion(new MyCriterion("Foo", true));
myModel.addCriterion(new MyCriterion("Bar", false));
JPanel bottomPanel = new JPanel();
bottomPanel.add(new JLabel("Criterion:"));
bottomPanel.add(criterionNameField);
bottomPanel.add(beneficialCB);
bottomPanel.add(new JButton(new AddCriterion("Add")));
bottomPanel.add(new JButton(new RemoveCriterion("Remove")));
bottomPanel.add(new JButton(new DisplayCriterion("Display")));
setLayout(new BorderLayout());
add(new JScrollPane(criteriaTable));
add(bottomPanel, BorderLayout.PAGE_END);
}
private class RemoveCriterion extends AbstractAction {
public RemoveCriterion(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
int row = criteriaTable.getSelectedRow();
if (row >= 0) {
myModel.removeRow(row);
}
}
}
private class DisplayCriterion extends AbstractAction {
public DisplayCriterion(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
for (MyCriterion criterion : myModel.getCriteria()) {
System.out.println(criterion);
}
}
}
private class AddCriterion extends AbstractAction {
public AddCriterion(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
String name = criterionNameField.getText();
boolean beneficial = beneficialCB.isSelected();
MyCriterion myCriterion = new MyCriterion(name, beneficial);
myModel.addCriterion(myCriterion);
criterionNameField.selectAll();
criterionNameField.requestFocusInWindow();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
CriteriaList mainPanel = new CriteriaList();
JFrame frame = new JFrame("Criteria List");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}
似乎这将是最适合使用'JTable'到显示标准..为更好地提供帮助,请张贴[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –
请详细说明问题,以便我们可以更全面地了解它。 –
好的,所以我决定玩@ AndrewThompson的建议,看看我是否可以让JTable显示你之后的数据。请看下面的代码。 –