建立一个swing UI来实现一个方法编辑器

我建立了一个排序的方法编辑器。

的方法(MethodModel类),通常,具有以下元素 -
建立一个swing UI来实现一个方法编辑器

  1. List<String> inputVariableNames
  2. String resultVariableName

现在我有一个类MethodModel,其具有上述领域作为其成员。我还有一个类MethodModelContainer,它包含一个列表(LinkedList,因为被调用的方法的顺序很重要)为MethodModel s,这是当前文件/类中所有MethodModel的集合。

进出口试图使用UI搭建所凭借的一个用户可以编辑方法(或编辑MethodModel对象)的摆动UI。我计划通过每个MacroModel类有三个按钮,每个用于向上或向下箭头以将方法调用向下或向上移动LinkedList以及第三个按钮(每个按钮用于打开用户对话框可以编辑这个特定的对象的成员。
我以为有一个JTable,在MethodModelContainer的基础上,每行有1个单元格,包含3个按钮用于上述用途,每行代表一个MethodModel对象。
现在Jtable需要在MethodModelContainer更新后立即更新。
我已经阅读了关于如何将JButtons/Jpanels添加到JTable的一些示例,并且它们都涉及编写自定义Cell Renderer/Cell编辑器,这是我没有找到体面阅读理解的东西。

任何关于如何使用Jtable或其他方式实现我的用例的指针都会有所帮助。

回答:

  • List<String> inputVariableNames

  • with rows where each row would have 1 cell containing 3 buttons

然后myabe这种方式,你可以......,我不是说,这只是,你可以这样把每JComponents到JTable中分隔的单元格

import java.awt.*; 

import java.awt.event.*;

import java.util.EventObject;

import javax.swing.*;

import javax.swing.table.*;

public class ComponentTableTest {

private JFrame frame;

private JTable CompTable = null;

private CompTableModel CompModel = null;

private JButton addButton = null;

public static void main(String args[]) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

new ComponentTableTest().makeUI();

}

});

}

public void makeUI() {

CompTable = CreateCompTable();

JScrollPane CompTableScrollpane = new JScrollPane(CompTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

JPanel bottomPanel = CreateBottomPanel();

frame = new JFrame("Comp Table Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(CompTableScrollpane, BorderLayout.CENTER);

frame.add(bottomPanel, BorderLayout.SOUTH);

frame.setSize(new Dimension(800, 200));

frame.setLocation(150, 150);

//frame.pack();

frame.setVisible(true);

}

public JTable CreateCompTable() {

CompModel = new CompTableModel();

CompModel.addRow();

JTable table = new JTable(CompModel);

table.setRowHeight(new CompCellPanel().getPreferredSize().height);

table.setTableHeader(null);

CompCellEditorRenderer compCellEditorRenderer = new CompCellEditorRenderer();

table.setDefaultRenderer(Object.class, compCellEditorRenderer);

table.setDefaultEditor(Object.class, compCellEditorRenderer);

return table;

}

public JPanel CreateBottomPanel() {

addButton = new JButton("Add Comp");

addButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

Object source = ae.getSource();

if (source == addButton) {

CompModel.addRow();

}

}

});

JPanel panel = new JPanel(new GridBagLayout());

panel.add(addButton);

return panel;

}

}

class CompCellEditorRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {

private static final long serialVersionUID = 1L;

private CompCellPanel renderer = new CompCellPanel();

private CompCellPanel editor = new CompCellPanel();

@Override

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

renderer.setComp((Comp) value);

return renderer;

}

@Override

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

editor.setComp((Comp) value);

return editor;

}

@Override

public Object getCellEditorValue() {

return editor.getComp();

}

@Override

public boolean isCellEditable(EventObject anEvent) {

return true;

}

@Override

public boolean shouldSelectCell(EventObject anEvent) {

return false;

}

}

class CompTableModel extends DefaultTableModel {

private static final long serialVersionUID = 1L;

@Override

public int getColumnCount() {

return 1;

}

public void addRow() {

super.addRow(new Object[]{new Comp(0, 0, "", "")});

}

}

class Comp {

int type;

int relation;

String lower;

String upper;

public Comp(int type, int relation, String lower, String upper) {

this.type = type;

this.relation = relation;

this.lower = lower;

this.upper = upper;

}

}

class CompCellPanel extends JPanel {

private static final long serialVersionUID = 1L;

private JLabel labelWith = new JLabel("With ");

private JComboBox typeCombo = new JComboBox(new Object[]{"height", "length", "volume"});

private JComboBox relationCombo = new JComboBox(new Object[]{"above", "below", "between"});

private JTextField lowerField = new JTextField();

private JLabel labelAnd = new JLabel(" and ");

private JTextField upperField = new JTextField();

private JButton removeButton = new JButton("remove");

CompCellPanel() {

setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

relationCombo.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

enableUpper(relationCombo.getSelectedIndex() == 2);

}

});

enableUpper(false);

removeButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

JTable table = (JTable) SwingUtilities.getAncestorOfClass(JTable.class, (Component) e.getSource());

int row = table.getEditingRow();

table.getCellEditor().stopCellEditing();

((DefaultTableModel) table.getModel()).removeRow(row);

}

});

add(labelWith);

add(typeCombo);

add(relationCombo);

add(lowerField);

add(labelAnd);

add(upperField);

add(Box.createHorizontalStrut(100));

add(removeButton);

}

private void enableUpper(boolean enable) {

labelAnd.setEnabled(enable);

upperField.setEnabled(enable);

}

public void setComp(Comp Comp) {

typeCombo.setSelectedIndex(Comp.type);

relationCombo.setSelectedIndex(Comp.relation);

lowerField.setText(Comp.lower);

upperField.setText(Comp.upper);

enableUpper(Comp.relation == 2);

}

public Comp getComp() {

return new Comp(typeCombo.getSelectedIndex(), relationCombo.getSelectedIndex(), lowerField.getText(), upperField.getText());

}

}

以上是 建立一个swing UI来实现一个方法编辑器 的全部内容, 来源链接: utcz.com/qa/259360.html

回到顶部