нет отображения в JTextArea, несмотря на использование функции setText

1

Вот что я хотел показать для использования MouseEvents одного класса в другом... путем создания объекта прежнего класса...

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;
public class MyPagalpanti extends JPanel implements MouseListener
{Point a,b;
boolean drawLin,drawOvl,drawOvl2;
MyPagalpanti(){a=new Point(0,0);b=new Point(0,0);drawLin=false;drawOvl=false,drawOvl2=false;;setSize(300,300);addMouseListener(this);}
public void mouseClicked(MouseEvent m)
{if(!drawOvl){a=new Point(m.getX(),m.getY());drawOvl=true;drawOvl2=false;}
else {b=new Point(m.getX(),m.getY());drawOvl=true;drawOvl2=true;repaint();}//record("clicked",m);}
}
public void mouseEntered(MouseEvent m)
{
}
public void mousePressed(MouseEvent m)
{a=new Point(m.getX(),m.getY());repaint();}
public void mouseReleased(MouseEvent m)
{b=new Point(m.getX(),m.getY());}
public void mouseExited(MouseEvent m)
{}
public void paintComponent(Graphics g)
{if(drawLin){g.setColor(Color.yellow);g.drawLine((int)a.getX(),(int)a.getY(),(int)b.getX(),(int)b.getY());}//d=0;}
else if(drawOvl&&drawOvl2){g.setColor(Color.red);int width=(int)Math.abs(b.getX()-a.getX());
int h=(int)Math.abs(b.getY()-a.getY());
g.drawOval((int)a.getX(),(int)a.getY(),width,h);
}}
}

класс, в котором формируется объект MyPagalpanti:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
//import java.swing.JPanel.*;

public class Mithu extends JFrame// implements MouseListener
{JTextArea jta1,jta2;
Mithu(String title)
{
super(title);
MyPagalpanti p1=new MyPagalpanti();
jta1=new JTextArea();
jta2=new JTextArea();
p1.setOpaque(true);
jta1.setEditable(false);
jta2.setEditable(false);
setForeground(Color.blue);
p1.setPreferredSize(new Dimension(600,600));
p1.setLayout(new GridLayout(3,1,0,0));
getContentPane().add(p1);
pack();
setVisible(true);
}
void record(String s,MouseEvent e)
{jta1.setText(jta1.getText()+"\n"+s+""+e.toString());}
public void mouseClicked(MouseEvent m)
{record("clicked",m);}
public void mouseEntered(MouseEvent m)
{record("entered",m);}
public void mousePressed(MouseEvent m)
{record("pressed",m);}
public void mouseReleased(MouseEvent m)
{ record("released",m);}
public void mouseExited(MouseEvent m)
{record("exited",m);}

public static void main(String args[])
{Mithu m=new Mithu("HI ! Karamvir");
m.setVisible(true);}
}

пожалуйста, не идите по слову... Я знаю, что в моем коде есть много других ошибок... coz Я все еще работаю над этим... но для тех, кто говорит, что "MouseEvents будут доставлены только MouseListener из компонент, который он зарегистрировал на ", я думаю, вы говорите правильно, но если мы внимательно посмотрим, я использовал эту концепцию только... в этом коде..

  • 0
    Вы не очень хорошо это проверили. MouseListener никогда не добавляется в MouseEvtEx2 , поэтому record никогда не вызывается
  • 0
    Используйте последовательный и логический отступ для блоков кода. Отступ кода предназначен для того, чтобы помочь людям понять ход программы.
Показать ещё 4 комментария
Теги:
swing
jtextarea
mouselistener

3 ответа

2
Лучший ответ

Я сделал пару изменений, чтобы заставить его работать. вам нужно implement MouseListener на вашем MouseEvtEx2 а также добавить его в качестве MouseListener на свою panel p1

public class MouseEvtEx2 extends JFrame implements MouseListener {
    private JTextArea txtArea;

    public MouseEvtEx2(String title) {
        super(title);
        Panel p1 = new Panel();
        MyPanel panelTop = new MyPanel();
        panelTop.setBackground(new Color(0.98f, 0.97f, 0.85f));
        panelTop.setOpaque(true);
        panelTop.setPreferredSize(new Dimension(400, 200));
        panelTop.setBorder(BorderFactory.createRaisedBevelBorder());

        getContentPane().add(panelTop);
        txtArea = new JTextArea();
        txtArea.setEditable(false);
        JScrollPane pane = new JScrollPane(txtArea);
        pane.setPreferredSize(new Dimension(400, 200));
        p1.setLayout(new GridLayout(2, 1, 0, 0));
        getContentPane().add(p1);
        p1.addMouseListener(this);
        p1.add(pane);

        // txtArea.setText
        // revalidate();
        setSize(600, 600);
        show();
    }

    public void record(String st, MouseEvent et) {
        txtArea.setText("" + st + "" + et.toString());
    }// setVisible(true);}

    public void mouseClicked(MouseEvent evt) {
        record("Mouse clicked # of mouse clicks: " + evt.getClickCount(), evt);// +
                                                                                // " "
                                                                                // +

    }

    public void mouseEntered(MouseEvent evt) {
        record("Mouse entered ", evt);// .toString());
    }

    public void mouseExited(MouseEvent evt) {
        record("Mouse exited ", evt);// .toString());
    }

    public void mousePressed(MouseEvent evt) {
        record("Mouse pressed # of mouse clicks: ", evt);// .getClickCount() +
                                                            // " " +

    }

    public void mouseReleased(MouseEvent evt) {
        record("Mouse released ", evt);
    }

    public static void main(String[] args) {
        new MouseEvtEx2("Mouse events");
    }
}

Надеюсь это поможет.

  • 1
    Это не сработает. Вы добавили panelTop и p1 в panelTop и ту же позицию в контейнере, управляемом BorderLayout , поэтому вы рассмотрели одну проблему с другой: P
  • 0
    @MadProgrammer p1 перекрывает PanelTop, поэтому он будет работать, и я проверил его. ОП должен очистить свой код, чтобы избежать подобных проблем.
Показать ещё 5 комментариев
4

Чтобы добавить JBNizet ответ...

MouseListeners будут доставлены только на компоненты, которые могут быть отображены и зарегистрированы для уведомления. Создавая компонент, который прослушивает события мыши и добавляет его, ваш компонент не будет волшебным образом передавать эти события вашему компоненту.

Затем, в верхней части этого, вы добавляете два компонента в позицию по умолчанию (CENTER) компонента, управляемого BorderLayout...

getContentPane().add(panelTop);
//...
getContentPane().add(p1);

Это фактически делает первый компонент невидимым, что означает, что он не отображается...

  • Вы не должны вызывать show поскольку он устарел, вместо этого используйте setVisible.
  • Вы должны называть super.paintComponent в вашем методе paintComponent перед выполнением любой пользовательской картины, иначе у вас не будет проблем с super.paintComponent
  • Нет необходимости, чтобы paintComponent была public как вы никогда не хотите, чтобы кто-нибудь мог называть ее напрямую...

обновленный

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

Мне нравится говорить "Мне интересен этот фильм", но если вы не поедете в кинотеатры, вы никогда его не увидите...

Чтобы ваш класс Mithu получил уведомление о событии мыши, он должен зарегистрировать MouseListener против компонента, который он заинтересован в мониторинге.

Следующий пример регистрирует aa MouseListener в классе Mithu против экземпляра MyPagalpanti, который позволяет ему получать события мыши, которые генерируются экземпляром MyPagalpanti

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestMouseListener {

    public static void main(String[] args) {
        new TestMouseListener();
    }

    public TestMouseListener() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                Mithu m = new Mithu("HI ! Karamvir");
                m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                m.pack();
                m.setLocationRelativeTo(null);
                m.setVisible(true);
            }
        });
    }

    public class Mithu extends JFrame implements MouseListener
    {

        JTextArea jta1;

        Mithu(String title) {
            super(title);
            MyPagalpanti p1 = new MyPagalpanti();
            p1.addMouseListener(this);
            jta1 = new JTextArea();
            p1.setOpaque(true);
            jta1.setEditable(false);
            setForeground(Color.blue);
            setLayout(new GridLayout(2, 1));
            getContentPane().add(jta1);
            getContentPane().add(p1);
            pack();
            setVisible(true);
        }

        void record(String s, MouseEvent e) {
            jta1.append("\n" + s + "" + e.toString());
        }

        public void mouseClicked(MouseEvent m) {
            record("clicked", m);
        }

        public void mouseEntered(MouseEvent m) {
            record("entered", m);
        }

        public void mousePressed(MouseEvent m) {
            record("pressed", m);
        }

        public void mouseReleased(MouseEvent m) {
            record("released", m);
        }

        public void mouseExited(MouseEvent m) {
            record("exited", m);
        }
    }

    public class MyPagalpanti extends JPanel implements MouseListener {

        Point a, b;
        boolean drawLin, drawOvl, drawOvl2;

        MyPagalpanti() {
            a = new Point(0, 0);
            b = new Point(0, 0);
            drawLin = false;
            drawOvl = false;
            drawOvl2 = false;
            setSize(300, 300);
            addMouseListener(this);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        public void mouseClicked(MouseEvent m) {
            if (!drawOvl) {
                a = new Point(m.getX(), m.getY());
                drawOvl = true;
                drawOvl2 = false;
            } else {
                b = new Point(m.getX(), m.getY());
                drawOvl = true;
                drawOvl2 = true;
                repaint();
            }//record("clicked",m);}
        }

        public void mouseEntered(MouseEvent m) {
        }

        public void mousePressed(MouseEvent m) {
            a = new Point(m.getX(), m.getY());
            repaint();
        }

        public void mouseReleased(MouseEvent m) {
            b = new Point(m.getX(), m.getY());
        }

        public void mouseExited(MouseEvent m) {
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            FontMetrics fm = g.getFontMetrics();
            if (a != null && b != null) {
                g.drawString(a + "-" + b, 0, fm.getHeight());
            }
            if (drawLin) {
                g.setColor(Color.yellow);
                g.drawLine((int) a.getX(), (int) a.getY(), (int) b.getX(), (int) b.getY());
            }//d=0;}
            else if (drawOvl && drawOvl2) {
                g.setColor(Color.red);
                int width = (int) Math.abs(b.getX() - a.getX());
                int h = (int) Math.abs(b.getY() - a.getY());
                g.drawOval((int) a.getX(), (int) a.getY(), width, h);
            }
        }
    }

}

Прежде чем идти дальше, вы действительно должны прочитать...

Поскольку у вас будут какие-то очень неприятные сюрпризы, если вы будете следовать своему текущему подходу.

Кроме того, было бы не больно читать через Как написать прослушиватель мыши

  • 0
    Ага! правда, что я добавляю два компонента с одинаковым расположением ... это действительно глупо! :( Но, будучи новичком, я должен делать такие ошибки, чтобы я мог учиться :) спасибо за руководство!
  • 0
    Итак, вы говорите, что мы не можем использовать методы из расширенного класса JPanel .. в расширенном классе JFrame? а также ... вы хотите сказать, что mouselistener должен быть реализован в обоих моих классах ... и мне сказали, что метод paintComponent находится в JPanel, который является легковесным контейнером, и чтобы преобразовать его в тяжелый вес, мы поместите его в JFrame, который является тяжелым контейнером, инициализируя объект типа MyPanel в расширенном классе JFrame (в котором mouselistener не ограничен) ...
Показать ещё 8 комментариев
3

У вашего класса есть методы mouseClicked(), mouseReleased() и т.д., Но он не реализует MouseListener. И даже если бы это было так, он никогда не добавлялся как MouseListener для любого компонента.

Итак, чтобы ваш класс реализовал MouseListener:

public class MouseEvtEx2 extends JFrame implements MouseListener {

и добавьте себя как слушатель мыши к компоненту, который вы хотите прослушать:

panelTop.addMouseListener(this);

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

  • 0
    Добавьте super.paintComponent и тот факт, что paintComponent public и super.paintComponent ответ;)
  • 0
    Я добавил дополнительный ответ, который подчеркивает некоторые дополнительные проблемы. Если вы хотите включить его в свой ответ, я удалю мой и уменьшу беспорядок ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню