【发布时间】:2015-10-01 23:25:33
【问题描述】:
我正在做一个程序,当我将鼠标拖过 JFrame 时,用数组绘制(创建)面板,但是当我尝试将 mousePressedEvent 添加到数组对象时它不起作用。
package Swing;
import java.awt.Point;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
public class testRec extends javax.swing.JFrame {
Point clickPoint;
JPanel[] panelDraw = new JPanel[10];
int numberOfRectangle = 0;
public testRec() {
initComponents();
}
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseDragged(java.awt.event.MouseEvent evt) {
formMouseDragged(evt);
}
});
addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
formMousePressed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
private void formMousePressed(java.awt.event.MouseEvent evt) {
clickPoint = evt.getPoint();
panelDraw[numberOfRectangle] = new JPanel();
panelDraw[numberOfRectangle].setBorder(new LineBorder(Color.ORANGE,2));
panelDraw[numberOfRectangle].setSize(0,0);
panelDraw[numberOfRectangle].setOpaque(false);
add(panelDraw[numberOfRectangle]);
}
private void formMouseDragged(java.awt.event.MouseEvent evt) {
Point dragPoint = evt.getPoint();
int x = Math.min(clickPoint.x, dragPoint.x);
int y = Math.min(clickPoint.y, dragPoint.y);
int width = Math.max(clickPoint.x - dragPoint.x, dragPoint.x - clickPoint.x);
int height = Math.max(clickPoint.y - dragPoint.y, dragPoint.y - clickPoint.y);
//Here is a Mouse Point error and i've solved by subtracting pixels
panelDraw[numberOfRectangle].setBounds(x, y-25, width, height);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new testRec().setVisible(true);
}
});
}
如果您在此处发现错误,请告诉我,
感谢您的帮助!
【问题讨论】:
-
要获得更好的帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。我们不想看到你的整个程序,而是你应该将你的代码压缩成仍然可以编译的最小部分,没有与你的问题无关的额外代码,但仍然可以证明你的问题。您可以通过简单地尝试隔离和暴露错误来自己解决问题。
-
newPanel[numberOfPanel].setSize(0,0);!!??抱歉,但是零大小的 JPanel 有什么用处呢?如何在太小而无法显示的东西上按下鼠标?另外,我希望您知道setSize(...)通常会被大多数布局管理器忽略。 -
它的大小为 0,因为它是程序其余部分的一部分,大小将由 mouseDragged 事件添加
-
大小为零时不能拖动。连老鼠都找不到。但无论如何,您将希望通过展示一个我们可以运行的小型可编译示例程序来改进这个问题,并为我们展示您的问题。
-
新代码的目的是什么?它如何无法正常工作?请注意,您的“数学错误”是因为您根据 JFrame 中的位置而不是实际容器中的位置设置大小 - JFrame 的 contentPane。但我可以保证,无论你想做什么,都有更好的方法,但在我知道你的目的之前,我不能说它是什么。
标签: java arrays swing graphics jpanel