【问题标题】:no display in JTextArea inspite of using setText function尽管使用了 setText 函数,但在 JTextArea 中没有显示
【发布时间】:2014-07-02 06:56:21
【问题描述】:

在这里,我想展示一个类的 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);}
}

请不要逐字逐句...我知道我的代码还有许多其他错误...因为我仍在努力...但是对于那些说“鼠标事件将只交付给从它注册到 " 的组件中的 MouseListener ,我猜你说得对,但如果我们仔细观察,我只使用了这个概念......在这段代码中......

【问题讨论】:

  • 你没有很好地测试这个。 MouseListener 永远不会添加到 MouseEvtEx2,因此永远不会调用 record
  • 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • yyea..但我已经从 MyPanel 类中导入了它!我在那里添加了 MouseListener。
  • 当你想买房子时,你的邻居赚了很多钱这一事实无关紧要。 MyPanel 类实现 MouseListener 的事实不会神奇地导致 MouseEvtEx2 中的 mouseClicked 方法被调用:它们是两个不同的对象。
  • 当然可以,但是我在 MouseEvtEx2 中创建了 MyPanel 类的对象!因此,该方法应该被导入。它们在同一个包中。所以,我直接在 MouseEvtEx2 中创建了一个 MyPanel 的对象

标签: java swing jtextarea mouselistener


【解决方案1】:

要添加它 JBNizet 的答案...

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

然后,最重要的是,您将两个组件添加到由BorderLayout 管理的组件的默认 (CENTER) 位置...

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

这实际上使第一个组件不可见,这意味着它不可显示...

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

更新

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

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

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

以下示例在Mithu 类中针对MyPagalpanti 的实例注册一个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);
            }
        }
    }

}

在你更进一步之前,你真的应该通读一遍......

如果您继续遵循当前的方法,您将会遇到一些非常令人讨厌的惊喜。

另外,通读How to Write a Mouse Listener也无妨

【讨论】:

  • 是的!确实,我添加了两个具有相同布局的组件..这真的很愚蠢! :(但是作为一个初学者,我应该犯这样的错误以便我可以学习:)谢谢指导!
  • 那么,您是说我们不能在 JFrame 扩展类中使用 JPanel 扩展类中的方法吗?还有..你想说mouselistener必须在我的两个类中实现吗..而且,有人告诉我paintComponent方法在JPanel中,它是一个轻量级容器,为了将它转换成重量级我们通过在 JFrame 扩展类中初始化一个 MyPanel 类型的对象,将它放在 JFrame 中,这是一个重量级容器(其中没有执行 mouselistener)...
  • 1- 是的,您必须为每个要监视鼠标事件的组件注册一个MouseListener。 2- 轻量级组件是没有自己的本地对等的任何组件,而是共享另一个重量级组件的本地对等。这意味着,你不能把一个轻量级的组件变成一个沉重的,这个概念是行不通的。 3- 为了绘制组件,它必须是可见的并添加到直接或间接显示(在屏幕上可见)的容器中
  • Ummm...看,没有在一个类中使用 MouseListener 并使用另一个类的对象,它有一个 MouseListener ,在这个(没有 MouseListener )类中,我可以使用鼠标事件.. .而且我有一个代码演示它...如果您认为我仍然错了,我可以向您展示该代码...我现在从某人那里得到它!
  • 了解,MouseEvents 只会从它注册到的组件传递给 MouseListener,而且 MouseEvents 是上下文相关的,也就是说,传递给您的侦听器的 MouseEvent 在注册它们的组件的上下文中(特别是位置)
【解决方案2】:

您的类有mouseClicked()mouseReleased() 等方法,但它没有实现MouseListener。即使是这样,它也不会作为 MouseListener 添加到任何组件中。

所以,让你的类实现 MouseListener:

public class MouseEvtEx2 extends JFrame implements MouseListener {

并将自己作为鼠标侦听器添加到您要侦听的组件中:

panelTop.addMouseListener(this);

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

【讨论】:

  • 添加super.paintComponent 以及paintComponentpublic 的事实并完善答案;)
  • 我添加了一个额外的答案,突出了一些额外的问题。如果您想将其合并到您的答案中,我将删除我的并减少混乱...
  • 那么,您是说我们不能在 JFrame 扩展类中使用 JPanel 扩展类中的方法吗?还有..你想说mouselistener必须在我的两个类中实现吗..而且,有人告诉我paintComponent方法在JPanel中,它是一个轻量级容器,为了将它转换成重量级我们通过在 JFrame 扩展类中初始化一个 MyPanel 类型的对象,将它放在 JFrame 中,这是一个重量级容器(其中没有执行 mouselistener)...
【解决方案3】:

我进行了一些更改以使其正常工作。您需要在 MouseEvtEx2 框架上添加 implement MouseListener,还需要将其作为 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");
    }
}

希望这会有所帮助。

【讨论】:

  • 这行不通。您已将panelTopp1 添加到BorderLayout 管理的容器中的同一位置,因此您已经解决了另一个问题:P
  • @MadProgrammer p1 覆盖了 panelTop,所以它可以工作,我已经测试过了。 OP 需要清理他们的代码以避免此类问题。
  • 问题是,p1 想画点东西,你通过创造另一个问题解决了一个问题
  • 我完全同意你的看法。我只是更改了此代码以使其按照 OP 的要求工作。
  • 您的代码正在运行..!我可以看到指示正在发生的事件的文字。谢谢!!...
猜你喜欢
  • 2021-10-12
  • 2015-02-02
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2022-08-10
  • 2019-06-19
相关资源
最近更新 更多