Как избежать (или использовать) события мыши во время перетаскивания разделителя JSplitPane? - PullRequest
2 голосов
/ 10 июня 2019

У меня включена JSplitPane с непрерывной разметкой.Как запретить другим компонентам получать события мыши во время перетаскивания разделителя?

enter image description here

public class Test {
  public static void main(String[] args) throws Exception {
    JButton top = new JButton("top");
    top.setRolloverEnabled(true);
    top.setMinimumSize(new Dimension(100, 100));
    top.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseEntered(MouseEvent e) {
        top.setBackground(Color.green);
      }

      @Override
      public void mouseExited(MouseEvent e) {
        top.setBackground(null);
      }
    });

    JButton bottom = new JButton("bottom");
    bottom.setRolloverEnabled(true);
    bottom.setMinimumSize(new Dimension(100, 100));
    bottom.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseEntered(MouseEvent e) {
        bottom.setBackground(Color.green);
      }

      @Override
      public void mouseExited(MouseEvent e) {
        bottom.setBackground(null);
      }
    });

    JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    split.setResizeWeight(0.5);
    split.setContinuousLayout(true);
    split.setTopComponent(top);
    split.setBottomComponent(bottom);

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(600, 400);
    f.setLocationRelativeTo(null);
    f.getContentPane().setLayout(new BorderLayout());
    f.getContentPane().add(split, BorderLayout.CENTER);
    f.setVisible(true);
  }
}

1 Ответ

1 голос
/ 10 июня 2019

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

Не знаю, как отключить все события.

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

Если это так, то вы можете добавить логику исключений в MouseListener, чтобы игнорировать событие mouseEntered при нажатии кнопки мыши:

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

public class Test {
  public static void main(String[] args) throws Exception {
    JButton top = new JButton("top");
    top.setRolloverEnabled(true);
    top.setMinimumSize(new Dimension(100, 100));
    top.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseEntered(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e)) return;

        top.setBackground(Color.green);
      }

      @Override
      public void mouseExited(MouseEvent e) {
        top.setBackground(null);
      }
    });

    JButton bottom = new JButton("bottom");
    bottom.setRolloverEnabled(true);
    bottom.setMinimumSize(new Dimension(100, 100));
    bottom.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseEntered(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e)) return;

        bottom.setBackground(Color.green);
      }

      @Override
      public void mouseExited(MouseEvent e) {
        bottom.setBackground(null);
      }
    });

    JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    split.setResizeWeight(0.5);
    split.setContinuousLayout(true);
    split.setTopComponent(top);
    split.setBottomComponent(bottom);

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(600, 400);
    f.setLocationRelativeTo(null);
    f.getContentPane().setLayout(new BorderLayout());
    f.getContentPane().add(split, BorderLayout.CENTER);
    f.setVisible(true);
  }
}

Редактировать:

Возможно, вы сможетеиспользуйте свой собственный EventQueue.EventQueue отвечает за отправку событий компонентам.Поэтому, возможно, вы сможете:

  1. Добавить MouseListener к разделителю
  2. на mousePressed вы замените EventQueue по умолчанию на свой собственный EventQueue, который будет игнорировать MouseEvents для всех компонентов, кроме разделителя.
  3. на мыши. Пожалуйста, восстановите исходную EventQueue.

Проверьте Глобальная диспетчеризация событий , чтобы получить базовый пример для начала работы.

...