所以,我有这个简单的程序,允许你点击一个JMenu项目" New Rectangle"它会在屏幕中央添加一个形状。我的问题是:如何在窗口点击并拖动它?我知道我需要某种类型的鼠标监听器,但我不确定如何实现它。
public class SimpleDraw {
public static void main(String[] args) {
JFrame frame = new UMLWindow();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(30, 30, 1000, 700);
frame.getContentPane().setBackground(Color.white);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
// Display the window.
frame.setVisible(true);
}
}
class UMLWindow extends JFrame {
Squares squares = new Squares();
private static final long serialVersionUID = 1L;
public UMLWindow() {
addMenus();
}
public void addMenus() {
getContentPane().add(squares);
JMenuBar menubar = new JMenuBar();
JMenu shapes = new JMenu("Shapes");
JMenuItem rectangleMenuItem = new JMenuItem("New Rectangle");
rectangleMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
squares.addSquare(10, 10, 100, 100);
}
});
shapes.add(rectangleMenuItem);
menubar.add(shapes);
setJMenuBar(menubar);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class Squares extends JPanel {
private static final long serialVersionUID = 1L;
private List<Rectangle> squares = new ArrayList<Rectangle>();
public void addSquare(int x, int y, int width, int height) {
Rectangle rect = new Rectangle(getWidth() / 2 - width / 2, getHeight()
/ 2 - height / 2, width, height);
squares.add(rect);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setOpaque(true);
this.setBackground(Color.WHITE);
Graphics2D g2 = (Graphics2D) g;
for (Rectangle rect : squares) {
g2.draw(rect);
}
repaint();
}
}
答案 0 :(得分:0)
也许它可以帮到你: http://zetcode.com/tutorials/javaswingtutorial/resizablecomponent/
代码的缺点
在这段代码中我们没有布局管理器。因此,如果我们在jframe的中心有一个组件,当这个jframe重新调整大小时,这个组件可能会显示在jframe的一角。你可以解决这个问题,但它有点复杂。如果你愿意,我们可以谈谈这个问题。
答案 1 :(得分:0)
我写了solution for this in this package here。您可以看到有一个AreaDragger类,听起来就像您要找的那样