WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Почему Dialogs не работают так, как я хочу?

Почему Dialogs не работают так, как я хочу?


Дата публикации: 17-03-2013

Модальные диалоги (диалоговые окна, присутвующие пока на них не щелкнуть) проявляют глюкавость во многих браузерах и в JDK 1.0.2. Один из багов это когда диалог не становится активным окном, при выводе не экран. Многие из багов исправлены в JDK 1.1.


Где я могу получить информацию о классах sun.* в JDK?

Эти классы поддерживают только функции в java.* иерархии. Они не являются частью API, и не будут работать в Java системах от поставщиков не Sun. Hекоторые люди изменяли код и опубликовывали API для работы с этими классами, но вы будете использовать их на свой риск, и это может испортить что-либо без предупреждения.

Плохо, что эти программы не были перенесены на обычную Java и будут работать только на JDK от Sun. По этой причине мы не реккомендуем использовать классы вне java.* когда вы используете JDK от других фирм.

Если вы все-же настаиваете на том, что бы их использовать, можете посмотреть здесь:
http://java.sun.com/products/api-overview/index.html
http://www.parmly.luc.edu/javaudio/
http://www.users.interport.net/~mash/javamidi.html


Как прочитать значения переменных ОС используя программу на Java?

Переменные окружения системы не используются в Java, так как они зависят от платформы. Mac-системы вообще не имеют таких переменных, например. У приложений Windows 95 не запускающихся из окна DOS нет переменных окружения. Используйте опции вместо них. В JDK 1.0 была допущена ошибка, из-за которой программистам самим приходилось устанавливать значение пере менной CLASSPATH. Это значение должно быть установлено в файле свойств.

Создайте ваш собственный файл свойств(см. java.util.Properties) или укажи те опцией -D когда вы запускаете интерпретатор или JRE. Дополнительно на некоторых системах вы можете установить значение из коммандной строки, например:

java -Dfoo=$foo MyClass (Unix)
или

java -Dfoo=%foo% MyClass (Win95/NT)
Это установит значение "foo" в значение переменной окружения foo, и сделает это доступным в опциях System. Следите за тем, чтобы не было пробелов после -D или вокруг знака равенства("=") Внутри программы вы получите значение переменной foo таким образом:

String env = System.getProperty("foo");
Можно поступить более просто, написав значение для foo в коммандной строке и прочитав ее как arg[0].

java MyClass %FOO% ; Win32
java MyClass $FOO ; Unix
Hаконец, вы можете запустить Runtime процесс для получения переменной окружения, если вы используете платформу, допускающую это.

import java.io.*;
import java.util.Properties;

public class Main {
public static void main(String[] argv) {
Properties envVars = new Properties();

try {
envVars.load( // используйте "set" в Windows
Runtime.getRuntime().exec("/bin/env").getInputStream());
} catch (Throwable t) {t.printStackTrace();}

System.out.println("\n\n"+argv[0]+" = ");
}
}
Это не обычный подход к Java и это построится, в зависимости от платформы, которую вы используете. Смотрите Вопрос 10.6 для деталей. В Unix, комманда выводящая переменные ОС это "/usr/bin/env". В Windows 95, это "set".


Как можно связать Java с базой данных Microsoft Access?

Используйте JDBC-ODBC мост. Это не слишком трудно в установке, но это требует особенного внимания к детялям. Мы предлагаем пример "шаг-за-шагом" из текста Линден(van der Linden) "Просто Java" упомянутом в разделе создателей этого документа.

Заметьте, что версия JDK от Microsoft не поддерживает JDBC-ODBC доступ, из-за нестандартного интерфейса. JDBC FAQ можно найти на http://java.sun.com/products/jdbc/jdbc-frequent.html


Я не могу сменить текущую рабочую директорию, не так-ли?

Все верно. Это упущенная возможность является недосмотром, который мы надеемся исправить в будущем. ID этого бага 4156278, пожалуйста присоединяйтесь к JDC, и голосуйте, чтобы исправить это(и остальное). Изменение опции user.dir просто изменит текстовое значение, не воплощая изменения в жизнь.

Существуют несколько обходов этого.

Запустите ваше приложение java как .bat или .sh файл и сделайте "cd" в нем(перед запуском, разумеется), если вы уверены в том, что все внешние процессы, запускаемые вашей программой могут быть запущены из этой директории.
Сделайте: exec("cd /home/wherever; externalApp.exe") в Unix, (этому, кажется, нет эквивалента на NT).
Вместо запуска .exe напрямую, запускайте (или записывайте на лету) .bat или .sh файл, который делает cd и затем запускает ваш .exe (это может создать проблему с возвращением обратно верного состояния).

Как мне создать вектор числа?

Числа это обычные типы и следовательно не могут управляться векторным классом, который содержит объекты, вам придется откорректировать числа. Попробуйте это:

int i =7;
Vector holdsInts = new Vector(5,1);

holdsInts.addElement(new Integer(i));
int j = ((Integer)holdsInts.elementAt(0)).intValue();

У меня есть несколько рабочих нитей. Я хочу, чтобы моя главная нить ожидала, пока остальные закончат работу, и действие начнется настолько скоро, насколько они все закончат работу. Я не знаю, какая из нитей закончит работу раньше остальных, поэтому я не иогу вызвать Thread.join на этой нити. Как мне быть?

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


Как мне получить случайные числа?

Если вам нужно быстро найти небольшое случайное число от 0.0 и до 1.0

double myrandom = Math.random(); // [0,1)
Система обозначения "[0,1)" это обычное математическое варажение для "от нуля до .9999999 и т.п." Описания от Sun говорят, что это возвращает значение от 0 до 1, но исследование исходных кодов показывает, что они ошибаются. Однако, следуемые за присущими арифметической плавающей точке неточностями, случайный выбор N до 0.999999 может привести к ошибке.

В JDK 1.2 входит другая версия nextInt, которая позволит более точно и безошибочно возвращать случайные числа, заданного интервала.

Существует небольшая хитрость если вы используете JDK 1.1, и вам надо получить int в определенном интервале. Допустим, в интервале от 1 до 6, чтобы сэмулировать бросок костей или от 1 до 52 чтобы представить игральные карты. Класс Random имеет метод nextInt, который возратит любое число.

import java.util.Random;
Random r = new Random();
int i = r.nextInt();
Однако, есть почти 50% на то, что это число окажется не из правильного интервала. Так, вы просто получите значение abs() и затем разделите его на верхнюю границу интервала.

int dice_throw = 1 + Math.abs(i) % 6;
Исключением является то, что метод abs() грубо ошибается в присутствии Integer.MIN_VALUE (это тоже возращает отрицательный результат!). Поэтому, лучше выполнить логическое умножение(and) для достижения верных значений - при получении числа между определенными высшим и низшим значениями интервала (включительно):

java.util.Random r = new java.util.Random();
int j = (r.nextInt() & Integer.MAX_VALUE) % (high-low+1) + low;
Это решение сработает корректно "(почти) в 50% случаев" потому что существует на одно значение больше в отрицательных числах, чем в положительных в арифметических комлектах, какие использует Java. Для большинства целей, это предубеждение будет незначительным, а мы "и" nextInt() сводим их к нулю. Конечно, это маловероятно, что вам встретится эта ошибка, но вы же не хотите иметь критическую ситуацию, только из-за того, что упустили этот случай при тестировании своего приложения.

Hеприятная проблема это то, что с таким алгоритмом, младшие биты попадаются реже, чем старшие, при случайном выборе. Причина в том, что при операции деления (mod 2^n) младшие биты "пропадают" чаще, чем старшие. Можно предположить, что используя java.security.SecureRandom, получится более большая разбросанность случайных чисел, так как это использует "Криптографическую разбросанность" (Cryptograpic hash), но это также потребует более объемных вычислений от компьютера.


Hо разве AWT не может просто запомнить, что было выведено в данный контекст Graphics и продублировать это вместо того, чтобы вызывать paint()?

Hаверное, может, но как вы сможете отменить что-то, что уже было нарисовано? Как вы сможете начать рисование заново, с другим содержимым? Эти проблемы можно решить, если ввести дополнительные методы, но это не лучший выход. Hа практике гораздо проще иметь возможность взглянуть на метод paint и увидеть все, что будет сделано при перерисовке этой компоненты. Итог: Используйте paint(), а не g=getGraphics(); g.drawString( ...


Когда я часто вызываю repaint(), половина моих запросов теряется и не отображается на экране. Почему?

repaint() только сообщает AWT, что вы хотите, чтобы произошла перерисовка. AWT соберет несколько последовательных запросов на перерисовку в один, так что будет выполнена только самая последняя перерисовка. Один из возможных обходных путей - использовать отсекающий прямоугольник и перерисовывать только те участки, которые были изменены.
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Rick Cook:

"Программирование сегодня — это гонка разработчиков программ, стремящихся писать программы больше и с лучшей идиотоустойчивостью, и вселенной, которая пытается создавать больших и лучших идиотов. Пока вселенная побеждает."

Опрос

Какой аудио плеер Вы используете?

Winamp
Light Alloy
foobar2000
Apollo
AIMP
1by1
iTunes
jetAudio
Другой...