Java-MouseListener在另一个类中?

时间:2018-07-25 23:29:01

标签: java user-interface mouselistener

我意识到这是一个重复的问题,但是我的情况略有不同。我需要在另一个类中增加一个MouseListener,该类可以使调用它的对象的背景色变高。请帮助我。

public class LeftListPanel extends JPanel {

public LeftListPanel() {
    setBackground(Settings.BACKGROUND_COLOR);
    setLayout(null);

    addPersonalStatsTab();
}

private void addPersonalStatsTab() {
    JPanel personalStatsPanel = new JPanel();
    personalStatsPanel.addMouseListener(new CustomMouseListener());

    JLabel personalStatsText = new JLabel("Text");
    personalStatsPanel.add(personalStatsText);

    add(personalStatsPanel);
}

然后我为MouseListener提供了一个内部嵌套的类,因为这是将调用此MouseListener的唯一位置。

class CustomMouseListener implements MouseListener {

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        setBackground(Settings.BACKGROUND_COLOR.brighter());
    }

    @Override
    public void mouseExited(MouseEvent e) {
        setBackground(Settings.BACKGROUND_COLOR);
    }

}

setBackground(COLOR)行是不起作用的... this.setBack和super.setBack在这种情况下不起作用。.我非常希望获得帮助!

3 个答案:

答案 0 :(得分:0)

看不到背景变化的原因是,当您调用this时,您将取消(隐式)引用LeftListPanel对象,即addPersonalStatsTab的实例。因此,您实际上是在更改其背景,但您看不到它,因为在LeftListPanel实例内部还有另一个JPanel(在null方法处实例化),它占据了整个可见空间(甚至根本不可见,因为null的布局很奇怪;我不清楚)。

  • 首先,我建议您不要将setLayout(null)设置为布局。选择合适的布局,或将其设置为默认布局-不要调用personalStatsPanel

  • 然后,将LeftListPanel设置为setBackground私有成员。并在调用 LeftListPanel.this.personalStatsPanel.setBackground(...); 时,将其用作范围参考:

    /* width */
    ::-webkit-scrollbar {
        width: 20px;
    }
    
    /* Track */
    ::-webkit-scrollbar-track {
        box-shadow: inset 0 0 5px blue; 
        border-radius: 10px;
    }
     
    /* Handle */
    ::-webkit-scrollbar-thumb {
        background: yellow; 
        border-radius: 10px;
    }
    
    /* Handle on hover */
    ::-webkit-scrollbar-thumb:hover {
        background: green; 
    }
    
    .slider {
    	width: 100%;
    	height: auto;
    	display: flex;
    	overflow-x: auto;
    	-webkit-overflow-scrolling: touch;
    	scroll-behavior: smooth;
      }
    
    .img {
    	flex-shrink: 0;
    	max-width: 100%;
    	height: 100%;
    }

答案 1 :(得分:0)

这有效,我只是创建了一个私有方法,在我要应用的面板中进行传递。

private void CustomMouseListener(JPanel panel) {
    panel.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            panel.setBackground(Settings.BACKGROUND_COLOR.brighter());
        }

        @Override
        public void mouseExited(MouseEvent e) {
            panel.setBackground(Settings.BACKGROUND_COLOR);
        }

    });
}

感谢大家的时间和建议:)

答案 2 :(得分:0)

您可以...

将要更改的组件的引用传递到CustomMouseListener

class CustomMouseListener implements MouseListener {

    private JPanel panel;

    public CustomMouseListener(JPanel panel) {
        this.panel = panel;
    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        panel.setBackground(Settings.BACKGROUND_COLOR.brighter());
    }

    @Override
    public void mouseExited(MouseEvent e) {
        panel.setBackground(Settings.BACKGROUND_COLOR);
    }

}

如果要在有限数量的组件上使用侦听器,这是可以的,但是如果要在多个组件上使用相同的侦听器,则可以...

您可以...

使用source的{​​{1}}属性获取触发事件的组件

MouseEvent

或者,更好的解决方案是做更多类似的事情...

@Override
public void mouseEntered(MouseEvent e) {
    if (!(e.getSource() instanceof JPanel)) {
        return;
    }
    JPanel panel = (JPanel)e.getSource();
    panel.setBackground(Settings.BACKGROUND_COLOR.brighter());
}

由于已经向您提供了信息(只是没有提供,所以它返回@Override public void mouseEntered(MouseEvent e) { e.getComponent().setBackground(Settings.BACKGROUND_COLOR.brighter()); } 的一个实例,因此,如果您需要访问Swing的特定属性,则仍然需要对其进行强制转换)。

为什么这种方法更好?

Component

因为它是不可知的,这意味着您可以创建侦听器的单个实例并在多个组件上重复使用