Java 为什么不是';我的油漆部件坏了吗?
我想用我的程序做的是,当我单击图像时,矩形将与JOptionPane一起出现。然而,JOptionPane是唯一出现的东西 我试着改变方法并添加更多的类,但没有任何效果><有人能解释我的问题吗?这是我的一段代码 下面是我调用filechooser的地方,它允许我选择我的照片。此外,这里还有很多其他的东西,比如标签Java 为什么不是';我的油漆部件坏了吗?,java,swing,paintcomponent,mouselistener,Java,Swing,Paintcomponent,Mouselistener,我想用我的程序做的是,当我单击图像时,矩形将与JOptionPane一起出现。然而,JOptionPane是唯一出现的东西 我试着改变方法并添加更多的类,但没有任何效果>
public Help(){
fc.setDialogTitle("Choose an image file to begin:");
int returnval = fc.showOpenDialog(null);
if (returnval == JFileChooser.APPROVE_OPTION){ //when user selects a file, value returned will be JFileChooser.APPROVE_OPTION
File file = fc.getSelectedFile(); //the File value of the selection is returned from a call on getSelectedFile
try{
image = ImageIO.read(file); //reads and loads File as image
}
catch (IOException e){}
System.out.println("You chose to open this file: " + file.getName());
}else
System.out.println("No file selected.");
icon = new ImageIcon(image);
label = new JLabel(icon);
tagName = new JLabel(input);
label.addMouseListener(new ImagePanel());
label.addMouseMotionListener(new ImagePanel());
panel.add(tagName);
}
最后是我的ImagePanel类,它包含麻烦的paintComponent。还有几个鼠标听器
class ImagePanel extends JPanel implements MouseListener, MouseMotionListener{
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
x = event.getX();
y = event.getY();
input = JOptionPane.showInputDialog("Enter tag name");
tagName.setText("You have tagged: " + input);
System.out.println(input);
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(image != null && isRectPresent){
g.setColor(Color.DARK_GRAY);
g.drawRect(x-50, y-50, 100, 100);
}
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
您可以编译代码并亲自查看。如果你知道怎么做,请给我一个提醒:)非常感谢 请注意:一个较小的例子应该在前面得到回答
使用其他名称将鼠标事件x和y分配给ImagePanel中的自定义字段,如:
int mx;
int my;
其他要试验的东西是省略super.paintComponent。
此外,您可能希望在g上使用更多方法:
Graphics2D g2 = (Graphics2D)g;
(给基类x和y赋值从来都不是一个好主意;最好使用setBounds,比如改变坐标。)注意:前面已经回答了一个较小的示例
使用其他名称将鼠标事件x和y分配给ImagePanel中的自定义字段,如:
int mx;
int my;
其他要试验的东西是省略super.paintComponent。
此外,您可能希望在g上使用更多方法:
Graphics2D g2 = (Graphics2D)g;
(指定给基类x和y从来都不是一个好主意;最好使用收进框来更改坐标。)
这里的代码说:“让我们试着读取一个图像。如果失败(抛出异常),那么忽略这个问题,在没有图像的情况下继续。”。忽视问题总是不好的。我们至少可以打印问题并继续
try{
image = ImageIO.read(file); //reads and loads File as image
}
catch (IOException e){
e.printStackTrace();//print the exception
}
或打印问题并停止:
try{
image = ImageIO.read(file); //reads and loads File as image
}
catch (IOException e){
e.printStackTrace();//print the exception
System.exit(0);//stop executing
}
实际问题很可能出现在这里:
if(image != null && isRectPresent){
g.setColor(Color.DARK_GRAY);
g.drawRect(x-50, y-50, 100, 100);
}
我认为问题在于if条件为false
(没有图像(可能读取图像时出现异常…?)和/或isRectPresent为false
),因此它不起任何作用!如果,则在处包含断点,在调试模式下启动程序,并在程序到达该点时检查变量图像
和isRectPresent
。(如果它没有到达那里,你知道你有一个不同的问题。)祝你好运
这里的代码说:“让我们试着读取一个图像。如果失败(抛出异常),那么忽略这个问题,在没有图像的情况下继续。”。忽视问题总是不好的。我们至少可以打印问题并继续
try{
image = ImageIO.read(file); //reads and loads File as image
}
catch (IOException e){
e.printStackTrace();//print the exception
}
或打印问题并停止:
try{
image = ImageIO.read(file); //reads and loads File as image
}
catch (IOException e){
e.printStackTrace();//print the exception
System.exit(0);//stop executing
}
实际问题很可能出现在这里:
if(image != null && isRectPresent){
g.setColor(Color.DARK_GRAY);
g.drawRect(x-50, y-50, 100, 100);
}
我认为问题在于if条件为false
(没有图像(可能读取图像时出现异常…?)和/或isRectPresent为false
),因此它不起任何作用!如果
,则在处包含断点,在调试模式下启动程序,并在程序到达该点时检查变量图像
和isRectPresent
。(如果它没有到达那里,你知道你有一个不同的问题。)祝你好运 各种奇怪的东西:
label.addMouseListener(new ImagePanel());
label.addMouseMotionListener(new ImagePanel());
您不应该仅仅为了向组件添加侦听器而创建新的JPanel。您已经有了该面板的一个实例
addMouseMotionListener(this);
切勿在绘制方法中将侦听器添加到组件。您永远无法控制何时调用绘画方法,最终会多次添加同一个侦听器。各种奇怪的东西:
label.addMouseListener(new ImagePanel());
label.addMouseMotionListener(new ImagePanel());
您不应该仅仅为了向组件添加侦听器而创建新的JPanel。您已经有了该面板的一个实例
addMouseMotionListener(this);
切勿在绘制方法中将侦听器添加到组件。您永远无法控制何时调用绘制方法,最终会多次添加同一个侦听器。请注意:通过添加@override
注释,确保确实覆盖了paintComponent
。另外,不要在paintComponent
中进行添加监听器等操作;-)重写到底做了什么?哈哈,我一点也不明白xD(这表明我真的是个笨蛋)。感谢您的回答。在测试时,尽可能简化问题:放弃所有不必要的方法,使paintComponent
变得非常简单,就像g.setColor();g、 drawRect()
无条件。告诉我们结果例如,如果您拼写错误paintComponent
或意外导入了错误的Graphics
类,只有当您明确表示您的方法@覆盖了超类中的某个方法时,编译器才会给出错误。我已经成功地创建了一个paintComponent,就像在一个框架上的简单drawRect中一样。但是,我不知道如何在图像上“应用”paintComponent。这太糟糕了:))请注意:通过添加@override
注释,确保确实覆盖了paintComponent
。另外,不要在paintComponent
中进行添加监听器等操作;-)重写到底做了什么?哈哈,我一点也不明白xD(这表明我真的是个笨蛋)。感谢您的回答。在测试时,尽可能简化问题:放弃所有不必要的方法,使paintComponent
变得非常简单,就像g.setColor();g、 drawRect()
无条件。告诉我们结果例如,如果您拼写错误paintComponent
或意外导入了错误的Graphics
类,只有当您明确表示您的方法@覆盖了超类中的某个方法时,编译器才会给出错误。我已经成功地创建了一个paintComponent,就像在一个框架上的简单drawRect中一样。但是,我不知道如何在图像上“应用”paintComponent。呃,这太糟糕了:)明白了。我实际上更改了代码。谢谢你的提示:)明白了。我实际上更改了代码。谢谢你的提示:)