This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 5c7cdab254cf5b6a2a027c6323623f28955d7bee Author: Andrus Adamchik <[email protected]> AuthorDate: Sat Aug 29 18:14:55 2026 -0400 Modeler: better cgen class selector UI --- .../modeler/platform/GenericUIInitializer.java | 1 - .../datamap/cgen/CgenArtefactSelectorPanel.java | 223 --------------- .../datamap/cgen/CgenArtifactSelectorPanel.java | 314 +++++++++++++++++++++ .../ui/project/editor/datamap/cgen/CgenPanel.java | 8 +- .../editor/datamap/cgen/CheckBoxHeader.java | 83 ------ 5 files changed, 318 insertions(+), 311 deletions(-) diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/GenericUIInitializer.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/GenericUIInitializer.java index 00dc9e077..ffc993c47 100644 --- a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/GenericUIInitializer.java +++ b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/GenericUIInitializer.java @@ -38,7 +38,6 @@ public class GenericUIInitializer implements UIInitializer { protected void overrideUIDefaults() { Color darkGrey = new Color(203, 203, 203); - UIManager.put("CheckBoxHeader.border", BorderFactory.createEmptyBorder(0, 15, 0, 0)); UIManager.put("CheckBoxMenuItem.selectionBackground", darkGrey); UIManager.put("CheckBoxMenuItem.selectionForeground", Color.BLACK); UIManager.put("MenuItem.selectionBackground", darkGrey); diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorPanel.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorPanel.java deleted file mode 100644 index 7fd7a5ea9..000000000 --- a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorPanel.java +++ /dev/null @@ -1,223 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.modeler.ui.project.editor.datamap.cgen; - -import org.apache.cayenne.configuration.ConfigurationNode; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.Embeddable; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.modeler.toolkit.icon.IconFactory; -import org.apache.cayenne.modeler.toolkit.table.IconCellRenderer; -import org.apache.cayenne.modeler.toolkit.table.TableSizer; -import org.apache.cayenne.validation.ValidationFailure; -import org.apache.cayenne.validation.ValidationResult; - -import javax.swing.Icon; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.ScrollPaneConstants; -import javax.swing.UIManager; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableColumnModel; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.util.Collection; -import java.util.List; - -/** - * Per-class artefact selector for the cgen editor — left-side table where the user toggles - * which classes participate in code generation, with validation icons in the rightmost column. - */ -public class CgenArtefactSelectorPanel extends JPanel { - - private static final Icon ERROR_ICON = IconFactory.buildIcon("icon-error.png"); - - private static final String[] COLUMN_HEADERS = {"", " Class", ""}; - private static final Class<?>[] COLUMN_CLASSES = {Boolean.class, JLabel.class, String.class}; - - private final CgenPanel cgen; - private final JTable table; - private final CheckBoxHeader checkBoxHeader; - private AbstractTableModel tableModel; - private ValidationResult lastValidationResult; - - public CgenArtefactSelectorPanel(CgenPanel cgen) { - this.cgen = cgen; - this.checkBoxHeader = new CheckBoxHeader(); - this.table = new JTable(); - - initLayout(); - } - - public void startup() { - initBindings(); - classSelectedAction(); - } - - public JTable getTable() { - return table; - } - - private void initLayout() { - table.setRowHeight(22); - DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); - renderer.setBackground(UIManager.getColor("Table.selectionBackground")); - table.getTableHeader().setDefaultRenderer(renderer); - - JScrollPane tablePanel = new JScrollPane( - table, - ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - - // set some minimal preferred size, so that it is smaller than other forms used in - // the dialog... this way we get the right automated overall size - tablePanel.setPreferredSize(new Dimension(300, 200)); - - setLayout(new BorderLayout()); - add(tablePanel, BorderLayout.CENTER); - } - - void initBindings() { - checkBoxHeader.addActionListener(e -> checkAllAction()); - - tableModel = new AbstractTableModel() { - public int getRowCount() { - return cgen.getClasses().size(); - } - - public int getColumnCount() { - return COLUMN_HEADERS.length; - } - - public String getColumnName(int col) { - return COLUMN_HEADERS[col]; - } - - public Class<?> getColumnClass(int col) { - return COLUMN_CLASSES[col]; - } - - public boolean isCellEditable(int row, int col) { - return col == 0; - } - - public Object getValueAt(int row, int col) { - Object item = getItem(row); - if (col == 0) return cgen.isSelected(item); - if (col == 1) return getItemName(item); - return getProblem(item); - } - - public void setValueAt(Object value, int row, int col) { - if (col == 0) { - cgen.setSelected(getItem(row), (Boolean) value); - classSelectedAction(); - } - } - - private Object getItem(int row) { - return cgen.getClasses().toArray()[row]; - } - }; - - table.setModel(tableModel); - - TableColumnModel columnModel = table.getColumnModel(); - columnModel.getColumn(0).setHeaderRenderer(checkBoxHeader); - columnModel.getColumn(1).setCellRenderer(new IconCellRenderer()); - columnModel.getColumn(2).setCellRenderer(new IconCellRenderer()); - - TableSizer.sizeColumns(table, Boolean.TRUE, "XXXXXXXXXXXXXXXXXXXXXXXXXX", "XX"); - } - - void classSelectedAction() { - int selectedCount = cgen.getSelectedEntitiesSize() - + cgen.getSelectedEmbeddablesSize() - + (cgen.isDataMapSelected() ? 1 : 0); - int totalClasses = cgen.getClasses().size(); - checkBoxHeader.setSelected(selectedCount >= totalClasses); - cgen.updateGenerateButton(); - cgen.updateSelectedEntities(); - cgen.getStandardModeController().updateTemplateEditorButtons(); - repaint(); - } - - private void checkAllAction() { - if (cgen.updateSelection(checkBoxHeader.isSelected() ? o -> true : o -> false)) { - tableModel.fireTableDataChanged(); - cgen.updateSelectedEntities(); - cgen.updateGenerateButton(); - cgen.getStandardModeController().updateTemplateEditorButtons(); - } - } - - public void validate(Collection<? extends ConfigurationNode> classes) { - CgenValidator validator = new CgenValidator(); - this.lastValidationResult = validator.getValidationResult(classes); - } - - public JLabel getProblem(Object obj) { - String name = null; - if (obj instanceof ObjEntity oe) { - name = oe.getName(); - } else if (obj instanceof Embeddable emb) { - name = emb.getClassName(); - } - - ValidationFailure validationFailure = null; - if (lastValidationResult != null) { - List<ValidationFailure> failures = lastValidationResult.getFailures(name); - if (!failures.isEmpty()) { - validationFailure = failures.get(0); - } - } - - JLabel labelIcon = new JLabel(); - labelIcon.setVisible(true); - if (validationFailure != null) { - labelIcon.setIcon(ERROR_ICON); - labelIcon.setToolTipText(validationFailure.getDescription()); - } - return labelIcon; - } - - public JLabel getItemName(Object obj) { - String className; - Icon icon; - if (obj instanceof Embeddable emb) { - className = emb.getClassName(); - icon = IconFactory.iconForObject(new Embeddable()); - } else if (obj instanceof ObjEntity oe) { - className = oe.getName(); - icon = IconFactory.iconForObject(new ObjEntity()); - } else { - className = ((DataMap) obj).getName(); - icon = IconFactory.iconForObject(new DataMap()); - } - JLabel labelIcon = new JLabel(); - labelIcon.setIcon(icon); - labelIcon.setVisible(true); - labelIcon.setText(className); - return labelIcon; - } -} diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtifactSelectorPanel.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtifactSelectorPanel.java new file mode 100644 index 000000000..ac5d220be --- /dev/null +++ b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtifactSelectorPanel.java @@ -0,0 +1,314 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.modeler.ui.project.editor.datamap.cgen; + +import org.apache.cayenne.configuration.ConfigurationNode; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.Embeddable; +import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.modeler.toolkit.icon.IconFactory; +import org.apache.cayenne.validation.ValidationFailure; +import org.apache.cayenne.validation.ValidationResult; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.Icon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; +import javax.swing.ScrollPaneConstants; +import javax.swing.UIManager; +import javax.swing.border.Border; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collection; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * Per-class artifact selector for the cgen editor. + */ +public class CgenArtifactSelectorPanel extends JPanel { + + private static final Icon ERROR_ICON = IconFactory.buildIcon("icon-error.png"); + + private static final int ROW_HEIGHT = 22; + private static final Border ROW_BORDER = BorderFactory.createEmptyBorder(0, 8, 0, 8); + + private final CgenPanel cgen; + private final JCheckBox selectAll; + private final JPanel classList; + private final List<ClassRow> rows; + + private ValidationResult lastValidationResult; + + public CgenArtifactSelectorPanel(CgenPanel cgen) { + this.cgen = cgen; + this.rows = new ArrayList<>(); + this.selectAll = new JCheckBox("Select All"); + this.classList = new JPanel(); + + initLayout(); + selectAll.addActionListener(e -> selectAllAction()); + } + + /** + * Rebuilds the class list from the current cgen configuration and syncs the "Select All" state. + */ + public void startup() { + refresh(); + classSelectedAction(); + } + + /** + * Rebuilds the class list from the current cgen configuration. Callers that want the validation + * icons to be up to date must run {@link #validate(Collection)} first. + */ + public void refresh() { + classList.removeAll(); + rows.clear(); + + Map<ClassType, List<Object>> groups = new EnumMap<>(ClassType.class); + for (Object item : cgen.getClasses()) { + groups.computeIfAbsent(ClassType.of(item), t -> new ArrayList<>()).add(item); + } + + boolean first = true; + for (List<Object> group : groups.values()) { + if (!first) { + classList.add(buildSeparator()); + } + first = false; + + for (Object item : group) { + ClassRow row = new ClassRow(item); + rows.add(row); + classList.add(row); + } + } + + classList.revalidate(); + classList.repaint(); + } + + private void initLayout() { + Color listBackground = UIManager.getColor("List.background"); + + classList.setLayout(new BoxLayout(classList, BoxLayout.Y_AXIS)); + classList.setBackground(listBackground); + + // keep the rows at their preferred height instead of stretching them over the viewport + JPanel listHolder = new JPanel(new BorderLayout()); + listHolder.setBackground(listBackground); + listHolder.add(classList, BorderLayout.NORTH); + + JScrollPane scrollPane = new JScrollPane( + listHolder, + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.getViewport().setBackground(listBackground); + + // set some minimal preferred size, so that it is smaller than other forms used in + // the dialog... this way we get the right automated overall size + scrollPane.setPreferredSize(new Dimension(300, 200)); + + // white like the list below it, with a grey line on top, so that it reads as a part of + // the list rather than of the grey toolbar above + selectAll.setOpaque(false); + JPanel selectAllRow = new JPanel(new BorderLayout()); + selectAllRow.setBackground(listBackground); + selectAllRow.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8)); + selectAllRow.add(selectAll, BorderLayout.WEST); + + JPanel header = new JPanel(new BorderLayout()); + header.setBackground(listBackground); + header.add(buildSeparator(), BorderLayout.NORTH); + header.add(selectAllRow, BorderLayout.CENTER); + header.add(buildSeparator(), BorderLayout.SOUTH); + + setLayout(new BorderLayout()); + add(header, BorderLayout.NORTH); + add(scrollPane, BorderLayout.CENTER); + } + + /** + * Called whenever the selection of a single class changes, either from this panel or from the + * outside. + */ + void classSelectedAction() { + int selectedCount = cgen.getSelectedEntitiesSize() + + cgen.getSelectedEmbeddablesSize() + + (cgen.isDataMapSelected() ? 1 : 0); + selectAll.setSelected(selectedCount >= cgen.getClasses().size()); + cgen.updateGenerateButton(); + cgen.updateSelectedEntities(); + cgen.getStandardModeController().updateTemplateEditorButtons(); + repaint(); + } + + private void selectAllAction() { + if (cgen.updateSelection(selectAll.isSelected() ? o -> true : o -> false)) { + rows.forEach(ClassRow::syncSelection); + cgen.updateSelectedEntities(); + cgen.updateGenerateButton(); + cgen.getStandardModeController().updateTemplateEditorButtons(); + } + } + + public void validate(Collection<? extends ConfigurationNode> classes) { + this.lastValidationResult = new CgenValidator().getValidationResult(classes); + } + + /** + * Returns the code generation problem detected for a class with the given name, or null if the + * class is valid. + */ + public ValidationFailure getProblem(String name) { + if (lastValidationResult == null || name == null) { + return null; + } + + List<ValidationFailure> failures = lastValidationResult.getFailures(name); + return failures.isEmpty() ? null : failures.get(0); + } + + /** + * Creates a thin grey line that does not stretch vertically under the list's {@link BoxLayout}. + */ + private static JSeparator buildSeparator() { + JSeparator separator = new JSeparator(); + separator.setMaximumSize(new Dimension(Integer.MAX_VALUE, separator.getPreferredSize().height)); + return separator; + } + + private static String nameOf(Object item) { + if (item instanceof Embeddable emb) { + return emb.getClassName(); + } else if (item instanceof ObjEntity oe) { + return oe.getName(); + } else { + return ((DataMap) item).getName(); + } + } + + private static Icon iconOf(Object item) { + if (item instanceof Embeddable) { + return IconFactory.iconForObject(new Embeddable()); + } else if (item instanceof ObjEntity) { + return IconFactory.iconForObject(new ObjEntity()); + } else { + return IconFactory.iconForObject(new DataMap()); + } + } + + /** + * Kinds of classes shown in the list. Rows are grouped by type in the order declared here, + * regardless of the order in which the cgen configuration hands them over. + */ + private enum ClassType { + + DATA_MAP, OBJ_ENTITY, EMBEDDABLE; + + static ClassType of(Object item) { + if (item instanceof ObjEntity) { + return OBJ_ENTITY; + } else if (item instanceof Embeddable) { + return EMBEDDABLE; + } else { + return DATA_MAP; + } + } + } + + /** + * A single class in the list — a real checkbox, the class icon and name, and an optional + * validation problem icon. Clicking anywhere in the row toggles the checkbox. + */ + private class ClassRow extends JPanel { + + private final Object item; + private final JCheckBox checkBox; + + ClassRow(Object item) { + super(new BorderLayout()); + + this.item = item; + this.checkBox = new JCheckBox(); + this.checkBox.setOpaque(false); + this.checkBox.setSelected(cgen.isSelected(item)); + this.checkBox.addActionListener(e -> selectionChangedAction()); + + JLabel name = new JLabel(nameOf(item), iconOf(item), JLabel.LEADING); + name.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0)); + + setBackground(UIManager.getColor("List.background")); + setBorder(ROW_BORDER); + + add(checkBox, BorderLayout.WEST); + add(name, BorderLayout.CENTER); + add(buildProblemLabel(), BorderLayout.EAST); + + addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + checkBox.doClick(); + } + }); + } + + @Override + public Dimension getPreferredSize() { + // keep the width computed from the row contents, so that a narrow panel scrolls + // horizontally instead of clipping long class names + return new Dimension(super.getPreferredSize().width, ROW_HEIGHT); + } + + @Override + public Dimension getMaximumSize() { + return new Dimension(Integer.MAX_VALUE, ROW_HEIGHT); + } + + void syncSelection() { + checkBox.setSelected(cgen.isSelected(item)); + } + + private void selectionChangedAction() { + cgen.setSelected(item, checkBox.isSelected()); + classSelectedAction(); + } + + private JLabel buildProblemLabel() { + JLabel label = new JLabel(); + ValidationFailure problem = getProblem(nameOf(item)); + if (problem != null) { + label.setIcon(ERROR_ICON); + label.setToolTipText(problem.getDescription()); + } + return label; + } + } +} diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java index 27844b89c..a076ab93f 100644 --- a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java +++ b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java @@ -75,7 +75,7 @@ public class CgenPanel extends ProjectPanel implements ObjEntityListener, Embedd private final Set<ConfigurationNode> classes; private final SelectionModel selectionModel; - private final CgenArtefactSelectorPanel classesSelector; + private final CgenArtifactSelectorPanel classesSelector; private final CgenConfigPanel cgenConfigPanel; private final JButton generateButton; @@ -108,7 +108,7 @@ public class CgenPanel extends ProjectPanel implements ObjEntityListener, Embedd this.removeConfigBtn = new RemoveCgenConfigAction(app, configurationsComboBox, () -> cgenConfigList, () -> configuration).buildButton(); this.cgenConfigPanel = new CgenConfigPanel(session, this); - this.classesSelector = new CgenArtefactSelectorPanel(this); + this.classesSelector = new CgenArtifactSelectorPanel(this); initLayout(); initBindings(); @@ -232,9 +232,9 @@ public class CgenPanel extends ProjectPanel implements ObjEntityListener, Embedd initConfigurationsComboBox(); setConfiguration((String) configurationsComboBox.getSelectedItem()); cgenConfigPanel.initForm(configuration); + classesSelector.validate(classes); classesSelector.startup(); initFromModel = false; - classesSelector.validate(classes); } /** @@ -338,8 +338,8 @@ public class CgenPanel extends ProjectPanel implements ObjEntityListener, Embedd selectionModel.clearAll(); setConfiguration((String) configurationsComboBox.getSelectedItem()); cgenConfigPanel.initForm(configuration); - classesSelector.initBindings(); classesSelector.validate(classes); + classesSelector.refresh(); }); generatorSelectedAction(); } diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CheckBoxHeader.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CheckBoxHeader.java deleted file mode 100644 index 5ec526e13..000000000 --- a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CheckBoxHeader.java +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - - -package org.apache.cayenne.modeler.ui.project.editor.datamap.cgen; - -import javax.swing.JCheckBox; -import javax.swing.JTable; -import javax.swing.UIManager; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableCellRenderer; -import java.awt.Component; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -class CheckBoxHeader extends JCheckBox implements TableCellRenderer, MouseListener { - - protected int column; - protected boolean mousePressed; - - @Override - public Component getTableCellRendererComponent( - JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - - this.column = column; - if (table != null) { - JTableHeader header = table.getTableHeader(); - if (header != null) { - header.addMouseListener(this); - } - } - this.setBackground(UIManager.getColor("Table.selectionBackground")); - setBorder(UIManager.getBorder("CheckBoxHeader.border")); - return this; - } - - @Override - public void mouseClicked(MouseEvent e) { - if (mousePressed) { - mousePressed = false; - JTableHeader header = (JTableHeader) (e.getSource()); - int columnAtPoint = header.columnAtPoint(e.getPoint()); - if (columnAtPoint == column) { - doClick(); - } - } - } - - @Override - public void mousePressed(MouseEvent e) { - mousePressed = true; - } - - @Override - public void mouseReleased(MouseEvent e) { - } - - @Override - public void mouseEntered(MouseEvent e) { - } - - @Override - public void mouseExited(MouseEvent e) { - } -} - -
