use of javax.swing.JTable in project JMRI by JMRI.
the class SectionTableAction method createModel.
/**
* Create the JTable DataModel, along with the changes for the specific case
* of Section objects
*/
@Override
protected void createModel() {
m = new BeanTableDataModel() {
public static final int BEGINBLOCKCOL = NUMCOLUMN;
public static final int ENDBLOCKCOL = BEGINBLOCKCOL + 1;
public static final int EDITCOL = ENDBLOCKCOL + 1;
@Override
public String getValue(String name) {
return "";
}
@Override
public Manager getManager() {
return jmri.InstanceManager.getDefault(jmri.SectionManager.class);
}
@Override
public NamedBean getBySystemName(String name) {
return jmri.InstanceManager.getDefault(jmri.SectionManager.class).getBySystemName(name);
}
@Override
public NamedBean getByUserName(String name) {
return jmri.InstanceManager.getDefault(jmri.SectionManager.class).getByUserName(name);
}
@Override
protected String getMasterClassName() {
return getClassName();
}
@Override
public void clickOn(NamedBean t) {
}
@Override
public int getColumnCount() {
return EDITCOL + 1;
}
@Override
public Object getValueAt(int row, int col) {
// some error checking
if (row >= sysNameList.size()) {
log.debug("row is greater than name list");
return "";
}
if (col == BEGINBLOCKCOL) {
Section z = (Section) getBySystemName(sysNameList.get(row));
if (z != null) {
return z.getBeginBlockName();
}
return " ";
} else if (col == ENDBLOCKCOL) {
Section z = (Section) getBySystemName(sysNameList.get(row));
if (z != null) {
return z.getEndBlockName();
}
return " ";
} else if (col == VALUECOL) {
Section z = (Section) getBySystemName(sysNameList.get(row));
if (z == null) {
return "";
} else {
int state = z.getState();
if (state == Section.FREE) {
return (rbx.getString("SectionFree"));
} else if (state == Section.FORWARD) {
return (rbx.getString("SectionForward"));
} else if (state == Section.REVERSE) {
return (rbx.getString("SectionReverse"));
}
}
} else if (col == EDITCOL) {
return Bundle.getMessage("ButtonEdit");
} else {
return super.getValueAt(row, col);
}
return null;
}
@Override
public void setValueAt(Object value, int row, int col) {
if ((col == BEGINBLOCKCOL) || (col == ENDBLOCKCOL)) {
return;
} else if (col == EDITCOL) {
class WindowMaker implements Runnable {
int row;
WindowMaker(int r) {
row = r;
}
@Override
public void run() {
String sName = (String) getValueAt(row, SYSNAMECOL);
editPressed(sName);
}
}
WindowMaker t = new WindowMaker(row);
javax.swing.SwingUtilities.invokeLater(t);
} else if (col == DELETECOL) {
deleteSectionPressed(sysNameList.get(row));
} else {
super.setValueAt(value, row, col);
}
}
@Override
public String getColumnName(int col) {
if (col == BEGINBLOCKCOL) {
return (rbx.getString("SectionFirstBlock"));
}
if (col == ENDBLOCKCOL) {
return (rbx.getString("SectionLastBlock"));
}
if (col == EDITCOL) {
// no namne on Edit column
return "";
}
return super.getColumnName(col);
}
@Override
public Class<?> getColumnClass(int col) {
if (col == VALUECOL) {
// not a button
return String.class;
}
if (col == BEGINBLOCKCOL) {
// not a button
return String.class;
}
if (col == ENDBLOCKCOL) {
// not a button
return String.class;
}
if (col == EDITCOL) {
return JButton.class;
} else {
return super.getColumnClass(col);
}
}
@Override
public boolean isCellEditable(int row, int col) {
if (col == BEGINBLOCKCOL) {
return false;
}
if (col == ENDBLOCKCOL) {
return false;
}
if (col == VALUECOL) {
return false;
}
if (col == EDITCOL) {
return true;
} else {
return super.isCellEditable(row, col);
}
}
@Override
public int getPreferredWidth(int col) {
// override default value for SystemName and UserName columns
if (col == SYSNAMECOL) {
return new JTextField(9).getPreferredSize().width;
}
if (col == USERNAMECOL) {
return new JTextField(17).getPreferredSize().width;
}
if (col == VALUECOL) {
return new JTextField(6).getPreferredSize().width;
}
// new columns
if (col == BEGINBLOCKCOL) {
return new JTextField(15).getPreferredSize().width;
}
if (col == ENDBLOCKCOL) {
return new JTextField(15).getPreferredSize().width;
}
if (col == EDITCOL) {
return new JTextField(6).getPreferredSize().width;
} else {
return super.getPreferredWidth(col);
}
}
@Override
public void configValueColumn(JTable table) {
// value column isn't button, so config is null
}
@Override
protected boolean matchPropertyName(java.beans.PropertyChangeEvent e) {
return true;
// return (e.getPropertyName().indexOf("alue")>=0);
}
@Override
protected String getBeanType() {
return "Section";
}
};
}
use of javax.swing.JTable in project JMRI by JMRI.
the class TableFrames method makeBlockPathFrame.
/*
* ********************* BlockPathFrame *****************************
*/
protected BlockPathFrame makeBlockPathFrame(OBlock block) {
String title = Bundle.getMessage("TitleBlockPathTable", block.getDisplayName());
BlockPathFrame frame = new BlockPathFrame(title, true, true, false, true);
if (log.isDebugEnabled()) {
log.debug("makeBlockPathFrame for Block " + block.getDisplayName());
}
frame.setName(block.getSystemName());
frame.init(block, this);
BlockPathTableModel blockPathModel = frame.getModel();
blockPathModel.init();
JTable blockPathTable = new JTable(blockPathModel);
blockPathTable.setTransferHandler(new jmri.util.DnDTableImportExportHandler(new int[] { BlockPathTableModel.EDIT_COL, BlockPathTableModel.DELETE_COL, BlockPathTableModel.UNITSCOL }));
blockPathTable.setDragEnabled(true);
blockPathTable.getColumnModel().getColumn(BlockPathTableModel.UNITSCOL).setCellRenderer(new MyBooleanRenderer(Bundle.getMessage("cm"), Bundle.getMessage("in")));
blockPathTable.getColumnModel().getColumn(BlockPathTableModel.EDIT_COL).setCellEditor(new ButtonEditor(new JButton()));
blockPathTable.getColumnModel().getColumn(BlockPathTableModel.EDIT_COL).setCellRenderer(new ButtonRenderer());
blockPathTable.getColumnModel().getColumn(BlockPathTableModel.DELETE_COL).setCellEditor(new ButtonEditor(new JButton()));
blockPathTable.getColumnModel().getColumn(BlockPathTableModel.DELETE_COL).setCellRenderer(new ButtonRenderer());
for (int i = 0; i < blockPathModel.getColumnCount(); i++) {
int width = blockPathModel.getPreferredWidth(i);
blockPathTable.getColumnModel().getColumn(i).setPreferredWidth(width);
}
blockPathTable.sizeColumnsToFit(-1);
int tableWidth = blockPathTable.getPreferredSize().width;
blockPathTable.setPreferredScrollableViewportSize(new java.awt.Dimension(tableWidth, ROW_HEIGHT * 10));
JScrollPane tablePane = new JScrollPane(blockPathTable);
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(5, 5));
JLabel prompt = new JLabel(Bundle.getMessage("AddPathPrompt"));
contentPane.add(prompt, BorderLayout.NORTH);
contentPane.add(tablePane, BorderLayout.CENTER);
frame.addInternalFrameListener(this);
frame.setContentPane(contentPane);
frame.setLocation(50, 30);
frame.pack();
return frame;
}
use of javax.swing.JTable in project JMRI by JMRI.
the class TableFrames method makeSignalFrame.
/*
* ********************* SignalFrame *****************************
*/
protected JInternalFrame makeSignalFrame() {
JInternalFrame frame = new JInternalFrame(Bundle.getMessage("TitleSignalTable"), true, false, false, true);
_signalModel = new SignalTableModel(this);
_signalModel.init();
_signalTable = new JTable(_signalModel);
TableRowSorter<SignalTableModel> sorter = new TableRowSorter<>(_signalModel);
_signalTable.setRowSorter(sorter);
_signalTable.setTransferHandler(new jmri.util.DnDTableImportExportHandler(new int[] { SignalTableModel.UNITSCOL, SignalTableModel.DELETE_COL }));
_signalTable.setDragEnabled(true);
_signalTable.getColumnModel().getColumn(SignalTableModel.UNITSCOL).setCellRenderer(new MyBooleanRenderer(Bundle.getMessage("cm"), Bundle.getMessage("in")));
_signalTable.getColumnModel().getColumn(SignalTableModel.DELETE_COL).setCellEditor(new ButtonEditor(new JButton()));
_signalTable.getColumnModel().getColumn(SignalTableModel.DELETE_COL).setCellRenderer(new ButtonRenderer());
for (int i = 0; i < _signalModel.getColumnCount(); i++) {
int width = SignalTableModel.getPreferredWidth(i);
_signalTable.getColumnModel().getColumn(i).setPreferredWidth(width);
}
_signalTable.sizeColumnsToFit(-1);
int tableWidth = _signalTable.getPreferredSize().width;
_signalTable.setPreferredScrollableViewportSize(new java.awt.Dimension(tableWidth, ROW_HEIGHT * 8));
_signalTablePane = new JScrollPane(_signalTable);
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(5, 5));
JLabel prompt = new JLabel(Bundle.getMessage("AddSignalPrompt"));
contentPane.add(prompt, BorderLayout.NORTH);
contentPane.add(_signalTablePane, BorderLayout.CENTER);
frame.setContentPane(contentPane);
frame.setLocation(200, 350);
frame.pack();
return frame;
}
use of javax.swing.JTable in project JMRI by JMRI.
the class WarrantRoute method makeRouteTablePanel.
protected JPanel makeRouteTablePanel() {
JTable routeTable = new JTable(_routeModel);
routeTable.setDefaultEditor(JComboBox.class, new jmri.jmrit.symbolicprog.ValueEditor());
//routeTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for (int i = 0; i < _routeModel.getColumnCount(); i++) {
int width = _routeModel.getPreferredWidth(i);
routeTable.getColumnModel().getColumn(i).setPreferredWidth(width);
}
JScrollPane tablePane = new JScrollPane(routeTable);
Dimension dim = routeTable.getPreferredSize();
dim.height = routeTable.getRowHeight() * 8;
tablePane.getViewport().setPreferredSize(dim);
JPanel routePanel = new JPanel();
routePanel.setLayout(new BoxLayout(routePanel, BoxLayout.Y_AXIS));
JLabel title = new JLabel(Bundle.getMessage("RouteTableTitle"));
routePanel.add(title, BorderLayout.NORTH);
routePanel.add(tablePane);
return routePanel;
}
use of javax.swing.JTable in project JMRI by JMRI.
the class PaneProgPane method newGridItem.
/**
* Create a grid item from the JDOM Element
*
* @param element element containing grid item contents
* @param showStdName show the name following the rules for the
* <em>nameFmt</em> element
* @param modelElem element containing the decoder model
* @param globs properties to configure the layout
* @return a panel containing the group
*/
public JPanel newGridItem(Element element, boolean showStdName, Element modelElem, GridGlobals globs) {
// get item-level attributes
List<Attribute> itemAttList = element.getAttributes();
List<Attribute> attList = new ArrayList<>(globs.gridAttList);
// merge grid and item-level attributes
attList.addAll(itemAttList);
// log.info("New gridtiem -----------------------------------------------");
// log.info("Attribute list:"+attList);
attList.add(new Attribute(LAST_GRIDX, ""));
attList.add(new Attribute(LAST_GRIDY, ""));
// log.info("Previous gridxCurrent="+globs.gridxCurrent+";gridyCurrent="+globs.gridyCurrent);
for (int j = 0; j < attList.size(); j++) {
Attribute attrib = attList.get(j);
String attribName = attrib.getName();
String attribRawValue = attrib.getValue();
Field constraint = null;
String constraintType = null;
// make sure we only process the last gridx or gridy attribute in the list
if (attribName.equals("gridx")) {
Attribute a = new Attribute(LAST_GRIDX, attribRawValue);
attList.set(attList.size() - 2, a);
//. don't process now
continue;
}
if (attribName.equals("gridy")) {
Attribute a = new Attribute(LAST_GRIDY, attribRawValue);
attList.set(attList.size() - 1, a);
//. don't process now
continue;
}
if (attribName.equals(LAST_GRIDX)) {
// we must be at end of original list, restore last gridx
attribName = "gridx";
if (attribRawValue.equals("")) {
// don't process blank (unused)
continue;
}
}
if (attribName.equals(LAST_GRIDY)) {
// we must be at end of original list, restore last gridy
attribName = "gridy";
if (attribRawValue.equals("")) {
// don't process blank (unused)
continue;
}
}
if ((attribName.equals("gridx") || attribName.equals("gridy")) && attribRawValue.equals("RELATIVE")) {
// NEXT is a synonym for RELATIVE
attribRawValue = "NEXT";
}
if (attribName.equals("gridx") && attribRawValue.equals("CURRENT")) {
attribRawValue = String.valueOf(Math.max(0, globs.gridxCurrent));
}
if (attribName.equals("gridy") && attribRawValue.equals("CURRENT")) {
attribRawValue = String.valueOf(Math.max(0, globs.gridyCurrent));
}
if (attribName.equals("gridx") && attribRawValue.equals("NEXT")) {
attribRawValue = String.valueOf(++globs.gridxCurrent);
}
if (attribName.equals("gridy") && attribRawValue.equals("NEXT")) {
attribRawValue = String.valueOf(++globs.gridyCurrent);
}
// log.info("attribName="+attribName+";attribRawValue="+attribRawValue);
try {
constraint = globs.gridConstraints.getClass().getDeclaredField(attribName);
constraintType = constraint.getType().toString();
constraint.setAccessible(true);
} catch (NoSuchFieldException ex) {
log.error("Unrecognised attribute \"" + attribName + "\", skipping");
continue;
}
switch(constraintType) {
case "int":
{
int attribValue;
try {
attribValue = Integer.valueOf(attribRawValue);
constraint.set(globs.gridConstraints, attribValue);
} catch (IllegalAccessException ey) {
log.error("Unable to set constraint \"" + attribName + ". IllegalAccessException error thrown.");
} catch (NumberFormatException ex) {
try {
Field constant = globs.gridConstraints.getClass().getDeclaredField(attribRawValue);
constant.setAccessible(true);
attribValue = (Integer) GridBagConstraints.class.getField(attribRawValue).get(constant);
constraint.set(globs.gridConstraints, attribValue);
} catch (NoSuchFieldException ey) {
log.error("Invalid value \"" + attribRawValue + "\" for attribute \"" + attribName + "\"");
} catch (IllegalAccessException ey) {
log.error("Unable to set constraint \"" + attribName + ". IllegalAccessException error thrown.");
}
}
break;
}
case "double":
{
double attribValue;
try {
attribValue = Double.valueOf(attribRawValue);
constraint.set(globs.gridConstraints, attribValue);
} catch (IllegalAccessException ey) {
log.error("Unable to set constraint \"" + attribName + ". IllegalAccessException error thrown.");
} catch (NumberFormatException ex) {
log.error("Invalid value \"" + attribRawValue + "\" for attribute \"" + attribName + "\"");
}
break;
}
case "class java.awt.Insets":
try {
String[] insetStrings = attribRawValue.split(",");
if (insetStrings.length == 4) {
Insets attribValue = new Insets(Integer.valueOf(insetStrings[0]), Integer.valueOf(insetStrings[1]), Integer.valueOf(insetStrings[2]), Integer.valueOf(insetStrings[3]));
constraint.set(globs.gridConstraints, attribValue);
} else {
log.error("Invalid value \"" + attribRawValue + "\" for attribute \"" + attribName + "\"");
log.error("Value should be four integers of the form \"top,left,bottom,right\"");
}
} catch (IllegalAccessException ey) {
log.error("Unable to set constraint \"" + attribName + ". IllegalAccessException error thrown.");
} catch (NumberFormatException ex) {
log.error("Invalid value \"" + attribRawValue + "\" for attribute \"" + attribName + "\"");
log.error("Value should be four integers of the form \"top,left,bottom,right\"");
}
break;
default:
log.error("Required \"" + constraintType + "\" handler for attribute \"" + attribName + "\" not defined in JMRI code");
log.error("Please file a JMRI bug report at https://sourceforge.net/p/jmri/bugs/new/");
break;
}
}
// log.info("Updated globs.GridBagConstraints.gridx="+globs.gridConstraints.gridx+";globs.GridBagConstraints.gridy="+globs.gridConstraints.gridy);
// create a panel to add as a new grid item
final JPanel c = new JPanel();
panelList.add(c);
GridBagLayout g = new GridBagLayout();
GridBagConstraints cs = new GridBagConstraints();
c.setLayout(g);
// handle the xml definition
// for all elements in the grid item
List<Element> elemList = element.getChildren();
log.trace("newGridItem starting with {} elements", elemList.size());
for (int i = 0; i < elemList.size(); i++) {
// update the grid position
cs.gridy = 0;
cs.gridx++;
Element e = elemList.get(i);
String name = e.getName();
log.trace("newGridItem processing {} element", name);
// decode the type
if (name.equals("display")) {
// its a variable
// load the variable
newVariable(e, c, g, cs, showStdName);
} else if (name.equals("separator")) {
// its a separator
JSeparator j = new JSeparator(javax.swing.SwingConstants.VERTICAL);
cs.fill = GridBagConstraints.BOTH;
cs.gridheight = GridBagConstraints.REMAINDER;
g.setConstraints(j, cs);
c.add(j);
cs.fill = GridBagConstraints.NONE;
cs.gridheight = 1;
} else if (name.equals("label")) {
cs.gridheight = GridBagConstraints.REMAINDER;
makeLabel(e, c, g, cs);
} else if (name.equals("soundlabel")) {
cs.gridheight = GridBagConstraints.REMAINDER;
makeSoundLabel(e, c, g, cs);
} else if (name.equals("cvtable")) {
makeCvTable(cs, g, c);
} else if (name.equals("indxcvtable")) {
log.debug("starting to build IndexedCvTable pane");
JTable indxcvTable = new JTable(_indexedCvModel);
JScrollPane cvScroll = new JScrollPane(indxcvTable);
indxcvTable.setDefaultRenderer(JTextField.class, new ValueRenderer());
indxcvTable.setDefaultRenderer(JButton.class, new ValueRenderer());
indxcvTable.setDefaultEditor(JTextField.class, new ValueEditor());
indxcvTable.setDefaultEditor(JButton.class, new ValueEditor());
indxcvTable.setRowHeight(new JButton("X").getPreferredSize().height);
indxcvTable.setPreferredScrollableViewportSize(new Dimension(700, indxcvTable.getRowHeight() * 14));
cvScroll.setColumnHeaderView(indxcvTable.getTableHeader());
// don't want a horizontal scroll bar
// Need to see the whole row at one time
// indxcvTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
cs.gridwidth = GridBagConstraints.REMAINDER;
g.setConstraints(cvScroll, cs);
c.add(cvScroll);
cs.gridwidth = 1;
// remember which indexed CVs to read/write
for (int j = 0; j < _indexedCvModel.getRowCount(); j++) {
String sz = "CV" + _indexedCvModel.getName(j);
int in = _varModel.findVarIndex(sz);
indexedCvList.add(in);
}
_cvTable = true;
log.debug("end of building IndexedCvTable pane");
} else if (name.equals("fnmapping")) {
pickFnMapPanel(c, g, cs, modelElem);
} else if (name.equals("dccaddress")) {
JPanel l = addDccAddressPanel(e);
if (l.getComponentCount() > 0) {
cs.gridheight = GridBagConstraints.REMAINDER;
g.setConstraints(l, cs);
c.add(l);
cs.gridheight = 1;
}
} else if (name.equals("column")) {
// nested "column" elements ...
cs.gridheight = GridBagConstraints.REMAINDER;
JPanel l = newColumn(e, showStdName, modelElem);
if (l.getComponentCount() > 0) {
panelList.add(l);
g.setConstraints(l, cs);
c.add(l);
cs.gridheight = 1;
}
} else if (name.equals("row")) {
// nested "row" elements ...
cs.gridwidth = GridBagConstraints.REMAINDER;
JPanel l = newRow(e, showStdName, modelElem);
if (l.getComponentCount() > 0) {
panelList.add(l);
g.setConstraints(l, cs);
c.add(l);
cs.gridwidth = 1;
}
} else if (name.equals("grid")) {
// nested "grid" elements ...
cs.gridwidth = GridBagConstraints.REMAINDER;
JPanel l = newGrid(e, showStdName, modelElem);
if (l.getComponentCount() > 0) {
panelList.add(l);
g.setConstraints(l, cs);
c.add(l);
cs.gridwidth = 1;
}
} else if (name.equals("group")) {
// nested "group" elements ...
JPanel l = newGroup(e, showStdName, modelElem);
if (l.getComponentCount() > 0) {
panelList.add(l);
g.setConstraints(l, cs);
c.add(l);
}
} else if (!name.equals("qualifier")) {
// its a mistake
log.error("No code to handle element of type " + e.getName() + " in newGridItem");
}
}
globs.gridxCurrent = globs.gridConstraints.gridx;
globs.gridyCurrent = globs.gridConstraints.gridy;
// add glue to the bottom to allow resize
if (c.getComponentCount() > 0) {
c.add(Box.createVerticalGlue());
}
// handle qualification if any
QualifierAdder qa = new QualifierAdder() {
@Override
protected Qualifier createQualifier(VariableValue var, String relation, String value) {
return new JComponentQualifier(c, var, Integer.parseInt(value), relation);
}
@Override
protected void addListener(java.beans.PropertyChangeListener qc) {
c.addPropertyChangeListener(qc);
}
};
qa.processModifierElements(element, _varModel);
return c;
}
Aggregations