Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';我的油漆部件坏了吗?_Java_Swing_Paintcomponent_Mouselistener - Fatal编程技术网

Java 为什么不是';我的油漆部件坏了吗?

Java 为什么不是';我的油漆部件坏了吗?,java,swing,paintcomponent,mouselistener,Java,Swing,Paintcomponent,Mouselistener,我想用我的程序做的是,当我单击图像时,矩形将与JOptionPane一起出现。然而,JOptionPane是唯一出现的东西 我试着改变方法并添加更多的类,但没有任何效果>

我想用我的程序做的是,当我单击图像时,矩形将与JOptionPane一起出现。然而,JOptionPane是唯一出现的东西

我试着改变方法并添加更多的类,但没有任何效果><有人能解释我的问题吗?这是我的一段代码

下面是我调用filechooser的地方,它允许我选择我的照片。此外,这里还有很多其他的东西,比如标签

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。呃,这太糟糕了:)明白了。我实际上更改了代码。谢谢你的提示:)明白了。我实际上更改了代码。谢谢你的提示:)