【问题标题】:MouseListener overriding Paint ComponentMouseListener 覆盖 Paint 组件
【发布时间】:2020-12-15 08:57:41
【问题描述】:

我正在尝试在 MVC 架构中创建一个程序,它只是打开一个具有某些特定设计的框架(JFrame),当用鼠标单击某处时,只需打印到控制台:“sth”通知操作成功完成但是似乎 Input.java 类在 Ouput.java 类之前添加到框架时被后者覆盖并禁用 MouseListener,或者前者覆盖后者,您可以在单击时激活执行某个程序的 MouseListener框架但不显示输出中的设计

这里是提到的类文件:

input.java:

package MouseListenerTest;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;

public class Input extends JPanel implements MouseListener
{
    Input()
    {
        addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
        System.out.println("Ej Adiiiii");
    }

    public void mousePressed(MouseEvent e) 
    {

    }

    public void mouseReleased(MouseEvent e) 
    {

    }

    public void mouseEntered(MouseEvent e) 
    {

    }

    public void mouseExited(MouseEvent e) 
    {

    }
}

输出.java

package MouseListenerTest;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Output  extends JPanel
{
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(0, 0, 500, 500);
    }
}

Frame.java

package MouseListenerTest;

import javax.swing.*;

public class Frame
{
    Frame()
    {
        JFrame frame = new JFrame();
        frame.getContentPane().add(new Output());
        frame.getContentPane().add(new Input());
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setTitle("MouseListener test");
    }
}

Controller.java

package MouseListenerTest;

public class Controller 
{
    public static void main(String[] args)
    {
        new Frame();
    }
}

我该如何解决这个问题?

【问题讨论】:

    标签: java swing model-view-controller paintcomponent mouselistener


    【解决方案1】:

    您的代码中的问题是因为您将元素添加到框架的方式,我更改为GridLayout 并将它们添加到框架以查看两者:

    frame.setLayout(new GridLayout(2, 1));
    frame.getContentPane().add(new Output());
    frame.getContentPane().add(new Input());
    

    more info about Layout Manager

    【讨论】:

    • 你混淆了 GridLayout 和 BorderLayout。
    【解决方案2】:

    您必须至少了解laying out components 的基本知识。

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多