2010-03-17 1 views
1

У меня проблема с разочарованием. У меня есть приложение, в котором колесо прокрутки не работает в окне JDialog (но работает в JFrame).Колесо мыши не прокручивается в 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 JREs:

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) 

Спасибо заранее,

Юлиан Şerbănoiu

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

LATER EDIT: Проблемы сохраняется с JRE/jdk_1.6.0_10, 1.6.0_16 также

СПУСТЯ EDIT 2: Назад домой, протестировано на Linux (Ubuntu - осознанная/рысь) - оба с OpenJDK и солнцезащитным козырьком Java от дистрибутив репо и он работает (я использовал файл .class, скомпилированный в Windows) !!! - поэтому я считаю, что сталкиваюсь с ошибкой JRE, которая возникает в некоторых конфигурациях Windows.

+0

Пожалуйста, не задавайте нам вопросы 2-в-1. –

+0

Не могли бы вы рассказать? Я только сказал, что это не работает с JDialog в некоторых конфигурациях (XP SP3 мой случай), и я хотел бы знать обходное решение, если это возможно. Теперь я знаю, что в некоторых конфигурациях (событие с тем же JRE) оно работает – INS

ответ

0

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

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

+0

Посмотрите на командную строку. Для разработки я использую JDK 1.6.0_17 (который также содержит JRE с той же версией), но система (когда я переехал из каталога bin) имеет более новую JRE (1.6.0_18) – INS

+0

Да, конечно, но я лично склонен к разработать с использованием JDK, который система использует по умолчанию, ради согласованности. Во всяком случае, я не смог воспроизвести ваше поведение в своем JDK 1.6.0_16, и это странно. – Riduidel

+0

Действительно - я загружаю JDK 1.6.0_16 и проверю результаты. Спасибо за подсказку – INS

1

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

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

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

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

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

Вы вызываете конструктор с JDialog в первом полугодии rameter

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

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

+0

. Тогда почему свиток работает только в случае «(JDialog) null»? Это реальный вопрос. Мне действительно нужно объяснение - это решение для меня - просто * взломать – INS

1

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

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

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

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

1

Я знаю, что это вряд ли ответ, но можете ли вы, пожалуйста, развлечь нас и исправить свой багги-код, чтобы кадр был создан на 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.

+0

Вы правы - это не ответ, но я действительно модифицировал код в соответствии с вашим предложением. +1 для этого. благодаря – INS

 Смежные вопросы

  • Нет связанных вопросов^_^