Колесо мыши не прокручивается в JDialog, но работает в JFrame - PullRequest
1 голос
/ 17 марта 2010

Я столкнулся с неприятной проблемой. У меня есть приложение, в котором колесо прокрутки не работает в окне JDialog (но работает в JFrame).

Вот код:

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

public class Failtest extends JFrame {

 public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
          new Failtest();             
       }
    });

 }

 public Failtest() {
  super();
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  setTitle("FRAME");
  JScrollPane sp1 = new   JScrollPane(getNewList());
  add(sp1);
  setSize(150, 150);
        setVisible(true);


  JDialog d = new JDialog(this, false);// NOT WORKING
        //JDialog d = new JDialog((JFrame)null, false); // NOT WORKING
        //JDialog d = new JDialog((JDialog)null, false);// WORKING - WHY? 

  d.setTitle("DIALOG");
        d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  JScrollPane sp = new JScrollPane(getNewList());

  d.add(sp);
  d.setSize(150, 150);
  d.setVisible(true);
 }

 public JList getNewList() {
  String objs[] = new String[30];
  for(int i=0; i<objs.length; i++) {
  objs[i] = "Item "+i;
 }
 JList l = new JList(objs);
  return l;
 }
}

Я нашел решение, которое присутствует в виде комментария в коде Java - конструктор, получающий нулевой параметр (JDialog).

Может ли кто-нибудь просветить меня? Мое мнение таково, что это ошибка Java.

Протестировано в Windows XP-SP3 с 1 JDK и 2 JRE:

D:\Program Files\Java\jdk1.6.0_17\bin>javac -version
javac 1.6.0_17

D:\Program Files\Java\jdk1.6.0_17\bin>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)

D:\Program Files\Java\jdk1.6.0_17\bin>cd ..

D:\Program Files\Java\jdk1.6.0_17>java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

Заранее спасибо,

Юлиан Шербаною

PS: Проблема не нова - код взят с форума ( здесь ), где также упоминалась эта проблема - но пока нет решения (пока)

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Проблема сохраняется с jre / jdk_1.6.0_10, 1.6.0_16 также

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ 2: Вернувшись домой, протестирован на Linux (Ubuntu - lucid / lynx) - как с openjdk, так и с sun-java из репозитория, и он работает (я использовал файл .class, скомпилированный в Windows) !!! - поэтому я считаю, что я сталкиваюсь с ошибкой JRE, которая происходит в некоторых конфигурациях Windows.

Ответы [ 4 ]

1 голос
/ 20 апреля 2010

Я знаю, что это маловероятный ответ, но не могли бы вы развлечь нас и исправить свой ошибочный код таким образом, чтобы кадр создавался в EDT (согласно спецификациям Sun) ??

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Failtest();             
        }
    });
}

Пока вы не закончили, я не уверен, что вы можете что-либо исключить.

У меня «работает для меня» с использованием Windows Vista на JRE 1.6.0_20.

1 голос
/ 18 марта 2010

Мне не удалось воспроизвести это в моей системе (Java 6u18 в Windows 7). Тем не менее, я подозреваю, что это проблема фокуса, когда события мыши не принимаются панелью прокрутки при использовании JFrame версии конструктора JDialog, и все же они принимаются при использовании JDialog версия.

Несколько вещей, которые вы можете попробовать здесь:

  1. Вы можете попробовать щелкнуть диалоговое окно и / или полосу прокрутки диалогового окна и посмотреть, влияет ли прокрутка мыши на полосу прокрутки после того, как вы нажали на нее.
  2. Вы можете программно запросить фокус для области прокрутки, вызвав requestFocusInWindow().
  3. Если requestFocusInWindow() не удалось, попробуйте requestFocus(). (requestFocus() не рекомендуется из-за различий в поведении платформы, но у вас, похоже, есть проблема, связанная с платформой.)
  4. Вы можете добавить FocusListener к своей полосе прокрутки, чтобы отслеживать, когда она получает и теряет фокус, что должно помочь вам подтвердить, имеет ли эта проблема какое-либо отношение к фокусу.
  5. Вы можете добавить MouseWheelListener к своей полосе прокрутки, чтобы увидеть, принимается ли каждая MouseWheelEvent панелью прокрутки или нет.

Как я уже сказал, я не мог воспроизвести эту проблему в своей системе, но это то, что я бы попробовал, если бы я устранял проблему, подобную той, которую вы описываете.

1 голос
/ 17 марта 2010

Это не ошибка, при использовании:

 JDialog d = new JDialog(this, false);
 JDialog d = new JDialog((JFrame)null, false);

Вы вызываете конструктор с Frame в первом параметре

Но при использовании

 JDialog d = new JDialog((JDialog)null, false);

Вы вызываете конструктор с JDialog в первом параметре

Может быть, сбивает с толку, потому что оба null, хотя вы должны указать, какой именно конструктор вам нужен.

UPDATE
После вашего комментария я только что понял, в чем проблема :), но я не могу воспроизвести его. Мышь прокручивается как в диалоге, так и во фрейме. Я использую Java 1.6 на Snow Leopard

0 голосов
/ 17 марта 2010

Что-то странное с вашей установкой Java: ваша версия по умолчанию - это не версия 1.6.0_17, которую вы нам показываете, а еще более новая версия 1.6.0_18.

В любом случае, используя мою (чуть более старую) версию 1.6.0_16 для Windows XP, я не могу воспроизвести вашу проблему, позволяя мне думать, что это может быть ошибка в J

...