gpt4 book ai didi

java - 构建 swing UI 以实现方法编辑器

转载 作者:行者123 更新时间:2023-11-30 07:27:26 25 4
gpt4 key购买 nike

我正在构建一个方法编辑器。

一个方法(MethodModel 类),通常具有以下元素 --

  1. List<String> inputVariableNames
  2. String resultVariableName

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

我正在尝试构建一个 Swing UI,用户可以借助该 UI 使用 UI 编辑方法(或编辑 MethodModel 对象)。我计划通过为每个 MacroModel 设置三个按钮来做到这一点类,2 个按钮,每个按钮用于“向上”和“向下”箭头,用于向下或向上移动 LinkedList 的方法调用和打开对话框的第三个按钮,用户可以通过该对话框编辑此特定 MethodModel 的成员对象。
我曾想过在 MethodModelContainer 的基础上有一个 JTable ,每行有 1 个单元格,其中包含 3 个用于上述用途的按钮,每行表示一个 MethodModel。对象。
现在 Jtable 需要在 MethodModelContainer 后立即更新自身。已更新。
我已经阅读了一些关于如何将 JButtons/Jpanels 添加到 JTable 的示例,所有这些示例都涉及编写自定义 Cell Renderer/Cell Editor,我还没有找到合适的读物来理解这些内容。

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

最佳答案

  • List<String> inputVariableNames

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

然后 myabe 这样你可以...,我不是说这是唯一的方法,你可以将每个 JComponents 放到 JTable 中的单独 Cell

enter image description here

enter image description here

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());
}
}

关于java - 构建 swing UI 以实现方法编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com