Java 使用setText函数后,JTextArea中不显示

Java 使用setText函数后,JTextArea中不显示,java,swing,jtextarea,mouselistener,Java,Swing,Jtextarea,Mouselistener,在这里,我想展示一下如何在另一个类中使用一个类的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; MyPa

在这里,我想展示一下如何在另一个类中使用一个类的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);}
}

请不要逐字逐句地说…我知道我的代码还有很多其他的bug…因为我还在处理它…但是对于那些说“MouseEvents将只从它注册到的组件传递到MouseListener”的人,我想你说的是对的,但是如果我们仔细看,我只使用了这个概念…在这段代码中..

您的类有
mouseClicked()
mouseRelease()
等方法,但它没有实现MouseListener。即使是这样,它也从来没有作为鼠标侦听器添加到任何组件中

因此,让您的类实现MouseListener:

public class MouseEvtEx2 extends JFrame implements MouseListener {
并将其自身作为鼠标侦听器添加到要侦听的组件:

panelTop.addMouseListener(this);

当然,为了帮助自己阅读和理解自己的代码,请正确缩进它。

您的类有
mouseClicked()
mouseReleased()
等方法,但它没有实现MouseListener。即使是这样,它也从来没有作为鼠标侦听器添加到任何组件中

因此,让您的类实现MouseListener:

public class MouseEvtEx2 extends JFrame implements MouseListener {
并将其自身作为鼠标侦听器添加到要侦听的组件:

panelTop.addMouseListener(this);

当然,为了帮助自己阅读和理解自己的代码,请正确缩进。

要添加代码,请参见JBNizet的答案

mouseListener
将仅传送到可显示且已注册通知的组件。创建一个正在侦听鼠标事件的组件并将其添加到您的组件不会神奇地将这些事件传递到您的组件

然后,除此之外,您正在将两个组件添加到由
BorderLayout
管理的组件的默认(
CENTER
)位置

getContentPane().add(panelTop);
//...
getContentPane().add(p1);
这实际上使第一个组件不可见,这意味着它不可显示

  • 您不应该调用
    show
    ,因为它已被弃用,请改用
    setVisible
  • 在进行任何自定义绘制之前,您应该在
    paintComponent
    方法中调用
    super.paintComponent
    ,否则将导致无止境的绘制问题
  • 没有必要将
    paintComponent
    设置为
    public
    ,因为您永远不希望任何人能够直接调用它
已更新

除非您对已收到的事件通知感兴趣,否则无论您创建什么对象或实现什么接口,都不会收到通知

这就像说“我对这部电影感兴趣”,但除非你去电影院,否则你永远看不到它

为了让您的
Mithu
类接收鼠标事件通知,它必须针对感兴趣的组件注册一个
MouseListener

下面的示例针对
MyPagalpanti
的实例在
Mithu
类中注册了一个
MouseListener
,这允许它接收由
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);
            }
        }
    }

}
在你进一步讨论之前,你真的应该通读

因为如果你继续遵循你目前的方法,你将会有一些非常令人不快的惊喜


另外,通读一下JBNizet的答案也没什么坏处

mouseListener
将仅传送到可显示且已注册通知的组件。创建一个正在侦听鼠标事件的组件并将其添加到您的组件不会神奇地将这些事件传递到您的组件

然后,除此之外,您正在将两个组件添加到由
BorderLayout
管理的组件的默认(
CENTER
)位置

getContentPane().add(panelTop);
//...
getContentPane().add(p1);
这实际上使第一个组件不可见,这意味着它不可显示

  • 您不应该调用
    show
    ,因为它已被弃用,请改用
    setVisible
  • 在进行任何自定义绘制之前,您应该在
    paintComponent
    方法中调用
    super.paintComponent
    ,否则将导致无止境的绘制问题
  • 没有必要将
    paintComponent
    设置为
    public
    ,因为您永远不希望任何人能够直接调用它
已更新

除非您对已收到的事件通知感兴趣,否则无论您创建什么对象或实现什么接口,都不会收到通知

这就像说“我对这部电影感兴趣”,但除非你去电影院,否则你永远看不到它

为了让您的
Mithu
类接收鼠标事件通知,它必须针对感兴趣的组件注册一个
MouseListener

下面的示例针对
MyPagalpanti
的实例在
Mithu
类中注册了一个
MouseListener
,这允许它接收由
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);
            }
        }
    }

}
在你进一步讨论之前,你真的应该通读

因为如果你继续遵循你目前的方法,你将会有一些非常令人不快的惊喜


另外,通读一下也没什么坏处,我做了几处修改使它工作起来。您需要在
MouseEvtEx2
框架上
实现MouseListener
,还需要将其作为MouseListener添加到
面板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");
    }
}

希望这能有所帮助。

我做了几处修改,使其正常工作。您需要在
MouseEvtEx2
框架上
实现MouseListener
,还需要将其作为MouseListener添加到