【发布时间】:2018-03-02 04:39:49
【问题描述】:
[更新!!!!] 这是成品:
:)
所以我正在开发一个程序,帮助我组织和打印晚餐座位。我有一个学生类,其实例变量为名字、姓氏等。我还有一个包含学生列表和字符串教师名的 DinnerTable 类。我创建了一个 GUI,以便更容易分配不同的座位。我已经在 JTabbedPane 上有一个选项卡,用于组织学生信息(如果它们可用或不可用)并随机排列他们坐的桌子。现在,为了更好地可视化表格并更轻松地将每个学生分配到特定座位,我需要做这样的事情: 我想在 TableModel 中使用实际的 DinnerTable 对象,以便每当我在此 Frame 上编辑某些内容时,更改都会转换为对象。但是,我不确定该怎么做。我应该:
1.创建表格(每个DinnerTable一个JTable)嵌套在更大的JTable的单元格中?但是我怎样才能执行诸如在 DinnerTable 之间滑动学生之类的操作呢?要么 2.在GridLayout或GridBagLayout中对齐JTables?但同样,我该如何交换学生?
谢谢! 打包晚餐清单;
public class Student
{
private String lastName;
private String firstName;
private int grade;
private int table;
private boolean gender;//Male=true, female=false;
private boolean available; //true=available;
public Student()
{
lastName="";
firstName="";
grade=0;
table=0;
gender=true;
available=true;
}
public Student(String l, String f, int i, boolean g, boolean a)
{
lastName=l;
firstName=f;
grade=i;
gender=g;
available=a;
//table is not written back to the txt.
table=0;
}
//Getters
public String getLastName()
{
return lastName;
}
public String getFirstName()
{
return firstName;
}
public int getGrade()
{
return grade;
}
public int getTable()
{
return table;
}
public boolean getGender()
{
return gender;
}
public boolean getAvailable()
{
return available;
}
//Setters
public void setLastName(String s)
{
this.lastName=s;
}
public void setFirstName(String s)
{
firstName=s;
}
public void setGrade(int i)
{
grade=i;
}
public void setTable(int hiahia)
{
table=hiahia;
}
public void setGender(boolean b)
{
gender=b;
}
public void setAvailable(boolean b)
{
available=b;
}
//Miscellaneous
public String toString()
{
String a="";
a=lastName+","+firstName+","+Integer.toString(grade)+","+Boolean.toString(gender)+","+Boolean.toString(available);
return a;
}
}
//////////////////////////////
package DinnerList;
import java.util.ArrayList;
import java.util.List;
public class DinnerTable
{
private List<Student> members= new ArrayList<Student>();
private int tableNumber=0;
private int capacity=0;
private String teacherName="";
private boolean available=true;
public DinnerTable(int a, int b, String c, boolean d)
{
tableNumber=a;
capacity=b;
teacherName=c;
available=d;
}
public void setTableNumber(int a) {tableNumber=a;}
public void setCapacity(int a) {capacity=a;}
public void setTeacherName(String a) {teacherName=a;}
public void setAvailable(boolean b) {available=b;}
public void add(Student s)
{
if(available&&(members.size()<capacity))
{ this.members.add(s); }
else if(!available)
{ System.out.println("Adding Student failed, table "+tableNumber+" not available");}
else
{ System.out.println("Adding Student failed, table "+tableNumber+" is full");}
}
public int getTableNumber()
{return tableNumber;}
public int getCapacity() {return this.capacity;}
public String getTeacherName() {return teacherName;}
public boolean getAvailable() {return available;}
public List<Student> getMembers(){return members;}
public void remove(Student s)
{
if(members.contains(s))
{
members.remove(s);
}
else
{
System.out.println("Failed to remove student from table because it wasn't there");
}
}
}
///////////////////
package DinnerList;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
public class DinnerTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
Object huahua =table.getModel().getValueAt(row, column);
String ppp="";
if(huahua!=null)
{
if(huahua instanceof Student)
{
ppp=((Student) huahua).getLastName()+", "+((Student)huahua).getFirstName();
}
else if(huahua instanceof String)
{
ppp=(String)huahua;
}
else
{
System.out.println("Error: DinnerTableCellRenderer intakes unknown data type");
}
}
else
{
ppp="";
}
JLabel label = (JLabel)super.getTableCellRendererComponent(table, ppp,isSelected, hasFocus,row, column);
return label;
}
}
//////////
package DinnerList;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class DinnerTableModel extends AbstractTableModel implements TableModel
{
private final String[] columnNames={"","","",""};
private List<DinnerTable> tableCollection= new ArrayList<DinnerTable>();
public DinnerTableModel(List<DinnerTable> huhu)
{
tableCollection.addAll(huhu);
}
public int getColumnCount()
{
return columnNames.length;
}
public int getRowCount()
{
if(tableCollection.size()%4==0)
{
return tableCollection.size()/4;
}
else
{
return (int)(tableCollection.size()/4)+1;
}
}
public String getColumnName(int col)
{
return columnNames[col];
}
public DinnerTable getTableAt(int row, int column)
{
if(tableCollection.size()>=(Integer)((row)/8)+column+1)
{
return tableCollection.get((Integer)((row)/8)+column);
}
else
{
return null;
}
}
public Object getValueAt(int rowIndex, int colIndex)
{
DinnerTable dd= this.getTableAt(rowIndex, colIndex);
String ss= "";
if(dd==null)
{
return "";
}
else if(rowIndex%8==0)
{
return (dd.getTableNumber()+". "+dd.getTeacherName());
}
else if(dd.getMembers().size()>=rowIndex%8)
{
return dd.getMembers().get(rowIndex%8);
}
else
{
return "";
}
}
public Class getColumnClass(int c)
{
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col)
{
if(this.getValueAt(row, col) instanceof Student)
{
return true;
}
else
{
return false;
}
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
if(aValue instanceof Student)
{
if(rowIndex%8!=0)
{
if(null!=this.getTableAt(rowIndex,columnIndex))
{
this.getTableAt(rowIndex,columnIndex).getMembers().set(rowIndex%8-1, (Student)aValue);
}
else
{
System.out.println("error: Attempting to put student in nonexistent table in table list gui");
}
}
else
{
System.out.println("error: Attempting to put student in a string in table list gui");
}
}
else if(aValue instanceof String)
{
System.out.println("error: Attempting to change teacher name in tablelist gui");
}
else
{
System.out.println("error: Attempting to set unknown object type in tablelist gui");
}
}
}
////****************////
JTable tableTable= new JTable(new DinnerTableModel(tables));
for(int hihihi=0;hihihi<tableTable.getColumnCount();hihihi++)
{
tableTable.getColumnModel().getColumn(hihihi).setCellRenderer(new DinnerTableCellRenderer());
}
JScrollPane scrollpaneB1= new JScrollPane();
scrollpaneB1.add(tableTable);
panelB.add(scrollpaneB1);
【问题讨论】:
-
从布局角度来看,您可以使用
GridLayout或GridBagLayout,两者都可以,GridBagLayout更复杂,但会为您提供更多选择。从数据的角度来看,首先从AbstractTableModel扩展,对于你的每一个对象,都应该创建一个对应的表模型,用来管理它们 -
@MadProgrammer 感谢您的回复(再次)!我已经建立了一个TableModel,但我觉得“getValueAt”方法真的很麻烦......由于默认调用该方法来显示每个单元格中的内容,它应该返回一个字符串值。但是,为了在 DinnerTables 之间交换学生,我需要一种方法,该方法可以在我单击单元格时获取每个单元格的实际学生。你觉得我应该怎么做?
-
"由于默认调用该方法显示每个单元格中的内容,所以它应该返回一个String值" - 其实它可以返回任何类型的@ 987654337@,然后你可以注册一个渲染器(和编辑器)来处理它
-
“但是,为了在 DinnerTables 之间交换学生,我需要一种方法,每当我单击单元格时,我都会在每个单元格中获取实际的学生” - 然后在您自定义
TableModel来执行此操作 - 或者,正如我之前所说,从getVaueAt返回实际的Student对象并依赖自定义渲染器来渲染它 - 没有冒犯,但这JTable101 -
也许你应该看看Using Custom Renderers
标签: java layout jframe jtable tablemodel