Почему не работает мой paintComponent? - PullRequest
0 голосов
/ 23 ноября 2011

Что я хочу сделать с моей программой, так это то, что когда я нажимаю на изображение, появляется прямоугольник вместе с панелью JOptionPane. Тем не менее, JOptionPane - единственное, что появляется.

Я пытался изменить методы и добавить больше классов, но ничего не получалось>. <Кто-нибудь может пролить свет на мою проблему? Вот фрагмент моего кода. </p>

Ниже я вызываю файловую палитру, которая позволяет мне выбрать мою фотографию. Также здесь есть куча других вещей, таких как этикетки.

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, который содержит проблемный компонент paintCan. Также пара мышиных слушателей.

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
        }
    }

Вы можете скомпилировать код и убедиться в этом сами. Напишите мне, если вы знаете, что делать :) Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Все виды странных вещей:

label.addMouseListener(new ImagePanel());
label.addMouseMotionListener(new ImagePanel()); 

Вы не должны создавать новую JPanel только для добавления слушателя к компоненту. У вас уже есть экземпляр панели.

addMouseMotionListener(this);  

Никогда не добавляйте слушателя к компоненту в методе рисования. Вы никогда не сможете контролировать, когда вызываются методы рисования, и в результате вы получите один и тот же слушатель, добавленный несколько раз.

1 голос
/ 23 ноября 2011

Одно примечание: на меньший пример ответили бы раньше.

Назначьте события мыши x и y для определенных пользователем полей в ImagePanel с другими именами, такими как:

int mx;
int my;

Еще одна вещь, с которой можно поэкспериментировать, это исключить super.paintComponent.Кроме того, может быть, вы хотите использовать больше методов для g:

Graphics2D g2 = (Graphics2D)g;

(Назначение базовых классов x и y никогда не является хорошей идеей; лучше использовать setBounds для чего-то вроде изменения координат.)

0 голосов
/ 23 ноября 2011
  try{
       image = ImageIO.read(file); //reads and loads File as image
   }
   catch (IOException e){}

Здесь код говорит: «давайте попробуем прочитать изображение. Если это не удастся (будет сгенерировано исключение), тогда проигнорируйте проблему и продолжите работу без изображения». Игнорирование проблем всегда плохо. Мы могли бы хотя бы распечатать проблему и продолжить.

  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), поэтому оно ничего не делает! Включите точку останова в if, запустите вашу программу в режиме отладки и проверьте переменные image и isRectPresent, когда программа достигнет этой точки. (Если этого не происходит, вы знаете, что у вас другая проблема.) Удачи!

...