將前幾次的 class 融合再一起,BUG 修正了一點,由於之前寫縮放的向量沒考慮四個角的所有情況。
以及移動基準的判斷限制為邊框,但除了四個角鄰近的位置。
還有 repaint 與 updateUI 的差異。
--> 待修正的功能 - 刪除,無法在選擇某個 PaintPanel 的 Object 偵測到 DELETE 鍵後自我刪除。
package package1;
import java.awt.*;
import javax.swing.*;
public class MainFrame extends JFrame {
private static int WIDTH = 1000, HEIGHT = 800;
MainFrame() {
this.setTitle("ButtonGroupObject");
this.setSize(WIDTH, HEIGHT);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(new MainPanel());
this.setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
}
package package1;
import java.awt.*;
import javax.swing.*;
public class MainPanel extends JPanel {
private static int WIDTH = 1000, HEIGHT = 500;
private DefaultListModel listModel;
private JList sampleJList;
MainPanel() {
this.setLayout(new GridBagLayout());
listModel = new DefaultListModel();
listModel.addElement("Select");
listModel.addElement("Class");
listModel.addElement("Association");
sampleJList = new JList(listModel);
sampleJList.setCellRenderer(new MRenderer());
sampleJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
sampleJList.setSelectionBackground(null);
sampleJList.setBackground(new Color(240, 240, 240));
Font displayFont = new Font("Serif", Font.BOLD, 35);
sampleJList.setFont(displayFont);
sampleJList.setSelectedIndex(0);
PaintPanel samplePanel = new PaintPanel();
GridBagConstraints GBC = new GridBagConstraints();
GBC.insets = new Insets(10, 10, 10, 10);
GBC.fill = GridBagConstraints.HORIZONTAL;
GBC.anchor = GridBagConstraints.NORTHEAST;
GBC.gridx = 0;
GBC.gridy = 0;
GBC.gridwidth = 1;
GBC.gridheight = 3;
GBC.weightx = 30;
GBC.weighty = 30;
this.add(sampleJList, GBC);
GBC = new GridBagConstraints();
GBC.insets = new Insets(10, 10, 10, 10);
GBC.fill = GridBagConstraints.BOTH;
GBC.anchor = GridBagConstraints.NORTHEAST;
GBC.gridx = 1;
GBC.gridy = 1;
GBC.gridwidth = 3;
GBC.gridheight = 3;
GBC.weightx = 300;
GBC.weighty = 150;
this.add(samplePanel, GBC);
}
public String getToolsSelected() {
int idx = sampleJList.getSelectedIndex();
return listModel.get(idx).toString();
}
}
package package1;
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class MRenderer extends DefaultListCellRenderer {
private Hashtable iconTable = new Hashtable();
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean hasFocus) {
JLabel label =
(JLabel)super.getListCellRendererComponent(list,
value.toString(),// display non-text.
index,
isSelected,
false);
ImageIcon icon = (ImageIcon)iconTable.get(value.toString()+isSelected);
if(icon == null) {
String fileName = value.toString();
if(isSelected == true)
fileName += "1.png";
else
fileName += "0.png";
icon = new ImageIcon(fileName);
iconTable.put(value.toString()+isSelected, icon);
}
label.setIcon(icon);
return label;
}
}
package package1;
import java.awt.*;
import javax.swing.*;
public class PaintPanel extends JPanel {
PaintPanel() {
this.setBackground(new Color(40, 40, 40));
ShowListener listener = new ShowListener();
this.addMouseListener(listener);
this.addMouseMotionListener(listener);
this.setLayout(null);
}
public String getToolsSelected() {
Component j1 = this.getParent();
if(j1 instanceof MainPanel)
return ((MainPanel) j1).getToolsSelected();
else
return null;
}
}
package package1;
import javax.swing.border.*;
import javax.swing.event.MouseInputListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
public class ResizeBorder extends AbstractBorder implements MouseInputListener {
private int gap;
private Color borderColor;
private int rectWidth, rectHeight;
private boolean selected;
public ResizeBorder(Color color, int gap, int w, int h) {
borderColor = color;
this.gap = gap;
rectWidth = w;
rectHeight = h;
/*
* ResizeObjectListener listener = new ResizeObjectListener();
* this.addMouseListener(listener);
* this.addMouseMotionListener(listener);
*/
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width,
int height) {
super.paintBorder(c, g, x, y, width, height);
if (g instanceof Graphics2D) {
Graphics2D g2d = (Graphics2D) g;
if (selected || usedLarge)
g2d.setColor(Color.BLUE);
else
g2d.setColor(borderColor);
// left-up corner.
g2d.fillRect(x, y, rectWidth, rectHeight);
g2d.fillRect(x, y, rectHeight, rectWidth);
// right-up corner.
g2d.fillRect(width - rectWidth, y, rectWidth, rectHeight);
g2d.fillRect(width - rectHeight, y, rectHeight, rectWidth);
// left-bottom corner.
g2d.fillRect(x, height - rectHeight, rectWidth, rectHeight);
g2d.fillRect(x, height - rectWidth, rectHeight, rectWidth);
// right-bottom corner.
g2d.fillRect(width - rectWidth, height - rectHeight, rectWidth,
rectHeight);
g2d.fillRect(width - rectHeight, height - rectWidth, rectHeight,
rectWidth);
}
}
@Override
public Insets getBorderInsets(Component c) {
return getBorderInsets(c, new Insets(gap, gap, gap, gap));
}
@Override
public Insets getBorderInsets(Component c, Insets insets) {
insets.left = insets.right = insets.bottom = insets.top = gap;
return insets;
}
@Override
public boolean isBorderOpaque() {
return true;
}
/*------------------------------------*/
private Point p = new Point(0, 0);
private boolean usedLarge;
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
// System.out.println("dragged");
if (SwingUtilities.isLeftMouseButton(e)) {
if (usedLarge) {
Component jl = (Component) e.getSource();
Point pt = e.getPoint();
int width = (int) jl.getBounds().getWidth();
int height = (int) jl.getBounds().getHeight();
Point[] corner = { new Point(0, 0), new Point(width, 0),
new Point(0, height), new Point(width, height) };
Point[] XYweight = { new Point(1, 1), new Point(0, 1),
new Point(1, 0), new Point(0, 0) };
Point[] WHweight = { new Point(-1, -1), new Point(1, -1),
new Point(-1, 1), new Point(1, 1) };
int cornerIdx = 0;
for (int i = 0; i < corner.length; i++) {
if (Math.pow(pt.x - corner[i].x, 2)
+ Math.pow(pt.y - corner[i].y, 2) < 30 * 30)
cornerIdx = i;
}
Point newP = SwingUtilities.convertPoint(jl, e.getPoint(),
jl.getParent());
int vx = newP.x - p.x, vy = newP.y - p.y;
jl.setBounds(jl.getX() + vx * XYweight[cornerIdx].x, jl.getY()
+ vy * XYweight[cornerIdx].y, jl.getWidth() + vx
* WHweight[cornerIdx].x, jl.getHeight() + vy
* WHweight[cornerIdx].y);
p = newP;
}
} else if (SwingUtilities.isRightMouseButton(e)) {
} else if (SwingUtilities.isMiddleMouseButton(e)) {
}
}
public void mouseReleased(MouseEvent e) {
if (usedLarge)
usedLarge = false;
Component jl = (Component) e.getSource();
((ClassDiagram) jl).updateUI();
jl.repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
Component jl = (Component) e.getSource();
jl.repaint();
selected = false;
}
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (e.getClickCount() == 2) {
Component jl = (Component) e.getSource();
Point pt = e.getPoint();
int width = (int) jl.getBounds().getWidth();
int height = (int) jl.getBounds().getHeight();
Point[] corner = { new Point(0, 0), new Point(width, 0),
new Point(0, height), new Point(width, height) };
boolean inCorner = false;
for (int i = 0; i < corner.length; i++) {
if (Math.pow(pt.x - corner[i].x, 2)
+ Math.pow(pt.y - corner[i].y, 2) < 30 * 30)
inCorner = true;
}
if (inCorner == false)
return;
selected = true;
System.out.println("selected");
return;
}
}
}
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (e.getClickCount() == 2) {
Component jl = (Component) e.getSource();
Point pt = e.getPoint();
int width = (int) jl.getBounds().getWidth();
int height = (int) jl.getBounds().getHeight();
Point[] corner = { new Point(0, 0), new Point(width, 0),
new Point(0, height), new Point(width, height) };
boolean inCorner = false;
for (int i = 0; i < corner.length; i++) {
if (Math.pow(pt.x - corner[i].x, 2)
+ Math.pow(pt.y - corner[i].y, 2) < 30 * 30)
inCorner = true;
}
if (inCorner == false)
return;
selected = true;
p = SwingUtilities.convertPoint(jl, e.getPoint(),
jl.getParent());
jl.repaint();
} else {
if (selected == true) {
usedLarge = true;
}
}
} else if (SwingUtilities.isRightMouseButton(e)) {
} else if (SwingUtilities.isMiddleMouseButton(e)) {
}
}
}
package package1;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputListener;
public class ShowListener implements MouseInputListener{
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
Component j1 = (Component) e.getSource();//jl = PaintPanel
if(((PaintPanel)j1).getToolsSelected() == "Class") {
ClassDiagram cd = new ClassDiagram();
Point newP = SwingUtilities.convertPoint(j1, e.getPoint(),
j1.getParent().getParent());
cd.setLocation(e.getPoint());
((PaintPanel)j1).add(cd);
((PaintPanel)j1).updateUI();
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
}
package package1;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class ClassDiagram extends JPanel implements KeyEventDispatcher {
private DefaultListModel attributeListModel;
private DefaultListModel methodListModel;
private JTextField className;
private JList classAttribute;
private JList classMethod;
private JTable table = null;
private MTableModel model = null;
private JScrollPane s_pan = null;
ClassDiagram() {
Font displayFont = new Font("Serif", Font.BOLD, 18);
attributeListModel = new DefaultListModel();
methodListModel = new DefaultListModel();
attributeListModel.addElement("+");
methodListModel.addElement("-");
className = new JTextField("ClassName");
classAttribute = new JList(attributeListModel);
classMethod = new JList(methodListModel);
className.setBackground(new Color(255, 255, 185));
className.setFont(displayFont);
className.setHorizontalAlignment(JTextField.CENTER);
// classAttribute.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
classAttribute.setBackground(new Color(255, 255, 185));
// classMethod.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
classMethod.setBackground(new Color(255, 255, 185));
this.setLayout(new GridBagLayout());
GridBagConstraints GBC = new GridBagConstraints();
GBC.insets = new Insets(1, 1, 1, 1);
GBC.fill = GridBagConstraints.BOTH;
GBC.anchor = GridBagConstraints.NORTHEAST;
GBC.gridx = 0;
GBC.gridy = 0;
GBC.gridwidth = 1;
GBC.gridheight = 1;
GBC.weightx = 30;
GBC.weighty = 30;
this.add(className, GBC);
GBC = new GridBagConstraints();
GBC.insets = new Insets(1, 1, 1, 1);
GBC.fill = GridBagConstraints.BOTH;
GBC.anchor = GridBagConstraints.NORTHEAST;
GBC.gridx = 0;
GBC.gridy = 1;
GBC.gridwidth = 1;
GBC.gridheight = 1;
GBC.weightx = 30;
GBC.weighty = 30;
this.add(classAttribute, GBC);
model = new MTableModel(10);
table = new JTable(model);
table.setBackground(new Color(255, 255, 185));
TableColumnModel tcm = table.getColumnModel();
// tcm.getColumn(3).setCellEditor(new DefaultCellEditor(com));
String[] choose = { "+", "#", "-", "~" };
JComboBox combx = new JComboBox(choose);
tcm.getColumn(0).setCellEditor(new DefaultCellEditor(combx));
tcm.getColumn(0).setPreferredWidth(10);
tcm.getColumn(1).setPreferredWidth(290);
model.addRow("toString()");
GBC = new GridBagConstraints();
GBC.insets = new Insets(1, 1, 1, 1);
GBC.fill = GridBagConstraints.BOTH;
GBC.anchor = GridBagConstraints.NORTHEAST;
GBC.gridx = 0;
GBC.gridy = 2;
GBC.gridwidth = 1;
GBC.gridheight = 5;
GBC.weightx = 150;
GBC.weighty = 150;
this.add(table, GBC);
this.setBounds(50, 50, 250, 250);
this.setBackground(Color.RED);
ResizeBorder rborder = new ResizeBorder(Color.RED, 5, 10, 30);
this.setBorder(rborder);
DragObjectListener listener = new DragObjectListener();
this.addMouseListener(rborder);
this.addMouseMotionListener(rborder);
this.addMouseListener(listener);
this.addMouseMotionListener(listener);
this.setBackground(Color.ORANGE);
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(this);
}
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_RELEASED)
return false;
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
}
return false;
}
}
class MTableModel extends AbstractTableModel {
// private static final long serialVersionUID = -7495940408592595397L;
private Vector content = null;
private String[] title_name = { "ID", "Name" };
public MTableModel() {
content = new Vector();
}
public MTableModel(int count) {
content = new Vector(count);
}
public void addRow(String name) {
Vector v = new Vector(2);
v.add(0, "+");
v.add(1, name);
content.add(v);
}
public void removeRow(int row) {
content.remove(row);
}
public void removeRows(int row, int count) {
for (int i = 0; i < count; i++) {
if (content.size() > row) {
content.remove(row);
}
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
public void setValueAt(Object value, int row, int col) {
((Vector) content.get(row)).remove(col);
((Vector) content.get(row)).add(col, value);
this.fireTableCellUpdated(row, col);
}
public String getColumnName(int col) {
return title_name[col];
}
public int getColumnCount() {
return title_name.length;
}
public int getRowCount() {
return content.size();
}
public Object getValueAt(int row, int col) {
return ((Vector) content.get(row)).get(col);
}
public Class getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
}
package package1;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputListener;
/**
* more explain by Chinese language : http://javapub.iteye.com/blog/739146 &
* http://hi.baidu.com/wwwpeng584/item/668f6ef7289020db6225d24a
*
* @author owner
*
*/
public class DragObjectListener implements MouseInputListener {
Point p = new Point(0, 0);
public DragObjectListener() {
}
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
Component jl = (Component) e.getSource();
Point pt = e.getPoint();
int width = (int) jl.getBounds().getWidth();
int height = (int) jl.getBounds().getHeight();
Point[] corner = { new Point(0, 0), new Point(width, 0),
new Point(0, height), new Point(width, height) };
for (int i = 0; i < corner.length; i++) {
if (Math.pow(pt.x - corner[i].x, 2)
+ Math.pow(pt.y - corner[i].y, 2) < 30 * 30)
return;
}
Point newP = SwingUtilities.convertPoint(jl, e.getPoint(),
jl.getParent());
jl.setLocation(jl.getX() + (newP.x - p.x), jl.getY()
+ (newP.y - p.y));
p = newP;
} else if (SwingUtilities.isRightMouseButton(e)) {
} else if (SwingUtilities.isMiddleMouseButton(e)) {
}
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
Component source = (Component) e.getSource();
}
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (e.getClickCount() == 2) {
Component source = (Component) e.getSource();
}
}
}
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
Component jl = (Component) e.getSource();
Point pt = e.getPoint();
int width = (int) jl.getBounds().getWidth();
int height = (int) jl.getBounds().getHeight();
Point[] corner = { new Point(0, 0), new Point(width, 0),
new Point(0, height), new Point(width, height) };
for (int i = 0; i < corner.length; i++) {
if (Math.pow(pt.x - corner[i].x, 2)
+ Math.pow(pt.y - corner[i].y, 2) < 30 * 30)
return;
}
p = SwingUtilities.convertPoint(jl, e.getPoint(), jl.getParent());
} else if (SwingUtilities.isRightMouseButton(e)) {
} else if (SwingUtilities.isMiddleMouseButton(e)) {
}
}
}
文章定位: