[英]Java Swing — Jpanel with Jbuttons embedded within a JTable
我在Swing中构建一个Ui,其中我的要求是在JTable中包含JPanes。 这些JPanes中将包含JButton。
我的用例如下-
我正在编写一个MethodEditor,其中我提供了一个UI来在提供的文件中存储方法。 用户界面还允许在单击按钮时编辑传递给方法的参数。
每个单一方法都具有如下UI表示形式-
我对Method类的基本表示如下-
public Class Method {
String methodName;
List<String> InputVariableNames;
String OutputVariableName;
}
现在我有了一个Method
对象List<Method> methodList
, List<Method> methodList
,我想以此为基础建立JTable。 该List
包含在MethodModel
类中,如下所示-
public class MethodModel {
List<Method> methodModel;
}
我曾问一个问题较早 ,并已根据我在那里提供的答案代码。
但是,我的代码似乎无法正常工作。 我的代码如下-
public class MethodEditor extends JTable {
private static final long serialVersionUID = 1L;
private MethodEditorModel model ;
private MethodCellRenderer cellRenderer;
public MethodEditor(MethodModel bean) {
setRowHeight(25);
this.setPreferredSize(new Dimension(500, 500));
model = new MethodEditorModel(bean);
this.setModel(model);
setupComponent();
}
private void setupComponent() {
cellRenderer = new MethodCellRenderer();
this.setDefaultRenderer(Object.class,cellRenderer);
this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
}
private static class MethodEditorModel extends DefaultTableModel implements PropertyChangeListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private MethodModel bean;
public MethodEditorModel(MethodModel bean) {
this.bean = bean;
bean.addPropertyChangeListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
fireTableDataChanged();
}
}
private static class MethodCellRenderer implements TableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
private MethodEditorCellPanel renderer = new MethodEditorCellPanel();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
MethodModel methodModel = (MethodModel)value;
for(Method method : methodModel.getMethodList()) {
renderer.setComponents((Method) method);
}
return renderer;
}
}
private static class MethodEditorCellPanel extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JButton upButton;
private JButton downButton;
private JButton methodDetailsButton;
private Method method;
public MethodEditorCellPanel() {
upButton = new JButton("Up");
downButton = new JButton("Down");
}
public void setComponents(Method method)
{
this.method = method;
methodDetailsButton = new JButton(method.getMethodName());
upButton.addActionListener(this);
downButton.addActionListener(this);
methodDetailsButton.addActionListener(this);
Box verticalBar = Box.createHorizontalBox();
verticalBar.add(upButton);
verticalBar.add(Box.createHorizontalStrut(15));
verticalBar.add(methodDetailsButton);
verticalBar.add(Box.createHorizontalStrut(15));
verticalBar.add(downButton);
add(verticalBar);
}
@Override
public void actionPerformed(ActionEvent evt) {
if(evt.getSource().equals(downButton)) {
}
if(evt.getSource().equals(upButton)) {
}
if(evt.getSource().equals(methodDetailsButton)) {
}
}
}
}
代码可以编译,但是JTable不显示。 任何有关我可能在做错事情的指示都将大有帮助。
不要在JTable中包含其他组件。 更不用说组件和其他多个组件了。 原因是JTable 不会将鼠标事件传递到其单元格。 因此,即使您在JTable中具有按钮,也必须注意通过以下方式自行按下按钮:
即使那样,您也不会得到按钮动画和东西。
如果需要将组件安排到表中,请将JPanel与GridLayout或GridBagLayout一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.