| Виды программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Графические компоненты в AWT можно ли отобразить java.awt.Window?, не делая pack || show на фрейме Вопрос о JSpinner ?? круглое окно в JAVA, возможно ли это ? (-) Вопрос по JAXB, как пропустить неизвестный тэг расскажите по подробнее: ComponentAdapter() paintComponent, помогите разобратся Визуальный компонент каледарь Как же перерисовать окно программы Перемещение Label по экрану, В проге надо Как Вы относитесь к курящим девушкам? Прежде чем задать вопрос, прочтите это! Документация и книги по Java, Давайте соберём ссылки Очередные данные о "медленности" JAVA TreeTable, как в NetBeans окно Properties Тормоза с JFreeChart Уровень доступа и JTabbedPanel, Отображение загладок XML Tree Добавление listener'а к Window или к Frame?, на чистом AWT JtextField невиден при обращении к нему по ссылке Размер окна, Как зафиксировать размер? JScrollPane JTable, Как как удолить заголовок таблицы? Нужен Пример по XML как получить значение переменной path Создание меню Splash screen, Как показать PNG Откуда взять пакет?, Надо взять пакет com.sun.xml.* Вставка иконки в ячейку JTable, Как делается? работаем с Java Sound, как работать со звуком ? Как в JTable сделать столбец не видимым?, На экране не видно, но в таблице есть JTable и Drag&Drop ProgressMonitor JTree и Drag & Drop, Почему так получается. Откуда берётся объект Graphics ? Компоненты JAVA, гед взять библиотеки Как соединять labels с помощью линий? Работа с событиями AWT и Swing, в чем разница? Visual Editor для Eclipse Как скрыть корневой (root) узел в дереве?, Root-нода д. б. невидима в JTree Вопрос по JTree, Как получить ссылку на корень собитие после закрытия JDialog JComboBox с объектами Smart GUI interface line in IDEA, как сделать фишечку с "+" ? JTable и autoscroll, Че-то я затупил.... непонятка с компиляцией Конец JVM ? проблема преобразования из аплета в приложение, имеется игруха в аплете, надо переделать StyledDocument проблемы с кодировкой в Сервлете, проблемы с кодировкой в Сервлете JTextPane Ошибка перерисовки JLabel со своим UI, Форма с JLabel не перерисовывается Цвета текста в jTextArea Установка значание после заполнения всех полей. Отрисовка JPanel Проблема с модальным окном Использование LayoutManager Hello World!..., Только немного сложнее Как Вы относитесь к курящим девушкам? Прежде чем задать вопрос, прочтите это! Документация и книги по Java, Давайте соберём ссылки Горячая клавиша, Проблема с присвоением клавише действия Как создать список цветов в jComboBox ? JPanel в Jpanel-e Как жестко задать размеры для елементов CUI?, setMinimumSize() что-то мало помогает... Обход сохранения если нет различия, все время просит сохранять!!,( Прорисовка элементов вопрос по showMessageDialog String.replaceAll |
Платные хостинги Раскрутка сайта Книги по программированию Ошибка перерисовки JLabel со своим UI, Форма с JLabel не перерисовывается
- А как это можно собратьКод this.setUI(new 3DTransformUI()); //Назначим свой менеджер для рисования меткиhighlightSyntax('javazOWRjY','java');3DTransform - такое имя разве возможно ? Добавлено @ 19:21 Кроме того, надо посмотреть - отвечает ли у тебя твоя метка за прорисовку своего фона. Если отвечает, то вообщем-то она действительно сама должна просить прорисоваться всем компонентам. Может она у тебя занимает всю область ?Текст проверить никак - ибо не мал (лениво немного ), а запустить не получается. - Я не понял, пока в чем дело но этот код у меня дает 100% загрузку процессора.Правда есть один момент, не знаю имеет ли он отношение к делу:Код AffineTransform aft = AffineTransform.getRotateInstance(-(0*3.14)/180);highlightSyntax('javaFmMjMw','java'); - Я понял в чем причина 100% загрузки проца:Код private void DrawTxt(String clippedText, Color newColor, JLabel label, Graphics g, int textX, int textY, int dx, int dy, boolean islblenabled){ label.setForeground(newColor);// проблема тут if(islblenabled) { paintEnabledText(label, g, clippedText, textX + dx, textY + dy); } else { paintDisabledText(label, g, clippedText, textX + dx, textY + dy); }}highlightSyntax('javamRhYjM','java');Вы меняете цвет компонента во время его перерисовки, что вызывает его перересовку, отсюда и бесконечный цикл. - LSDДа, спасибо большое. Именно так все и происходило.Теперь закономерно возникает вопрос (поскольку я все еще надеюсь, что мне удастся сделать трехмерной именно JLabel) как можно поменять цвет?Ведь в случае метки я не могу работать напрямую с кистями? - Что-то ступил, никто же мне не мешает использовать:g.setColor(...);BasicGraphicsUtils.drawString(g,clippedText,32, textX,textY);Вопрос теперь в другом, что-то у меня теперь все хорошо с загрузкой процессора и цветами, да вот только теперь имею обратную картину - все отлично перерисовывается кроме самой моей многострадальной метки.Непонятно - я же не перекрывал стандартный actionListener для BasicLabelUI, чего же это он не вызывает мой paint на invalidate? - Косяк здесь:Код AffineTransform aft = AffineTransform.getRotateInstance(-(0*3.14) / 180);aft.concatenate(new AffineTransform(1.0,0,0,1.0,dx,dy));g.setTransform(aft);DrawTxt(clippedText, new Color(150,150,150), label, g, textX, textY, 0, 0,label.isEnabled());highlightSyntax('javaMWEwMG','java');Если DrawTxt закоментарить, то все будет нормально перерисовываться. - LSD"Если DrawTxt закоментарить, то все будет нормально перерисовываться. "Если его закомментировать, то нечему будет нормально перерисовываться. Сейчас исправленный текст этой функции выглядит так:Код private void DrawTxt(String clippedText, Color newColor, JLabel label, Graphics g, int textX, int textY, int dx, int dy, boolean islblenabled) { if (islblenabled){ g.setColor(newColor); BasicGraphicsUtils.drawString(g,clippedText,label.getDisplayedMnemonic(), textX+dx,textY+dy); //paintEnabledText(label, g, clippedText, textX + dx, textY + dy); ////Рисуем цветом Foreground } else { g.setColor(label.getBackground()); BasicGraphicsUtils.drawString(g,clippedText,label.getDisplayedMnemonic(), textX+dx,textY+dy); //paintDisabledText(label, g, clippedText, textX + dx, textY + dy); //Рисуем цветом Background } }highlightSyntax('javajMjg1Z','java');Все работает - процессор не грузит, при сворачивании-разворачивании, изменении размеров или при перекрытии другим окошком ВСЕ нормально работает.Единственный косяк в ToolTips - после всплывающей подсказки на фоне моей метки прерисовка не происходит, точнее лезут артифакты.На сайте SUN нашел маловразумительную подсказку, что если использовать AffineTransform и/илиopaque в paint(), то возможны артефакты, а вот как с этим бороться не понял. - Сильно подозреваю, что в таком случае единого решения может и не найдется. Придется копаться и "бить в бубен". Если решение найдется - будем крайне признательны, если поделишься. Удачи. - Надо закоментарить только тот что я выделил, и тогда остальные 3 будут нормально перерисовываться.Вот что у меня получилось, все нормально перерисовывается, включая ToolTips Добавлено @ 21:17 Я думаю проблема в одном из AffineTransform. Присоединённый файл ( Кол-во скачиваний: 2 ) Label3D.zip - LSDН-да, во-первых, если я правильно понял, в первом варианте перерисовка происходила не из-за setForegraundColor, а из-за affineTransform (ну, или из-за сочетания того и другого) ?Мои дальнейшие эксперименты , см. мой пост выше, показали, что избежать зацикливания из-за affineTransform все же можно, но тогда попадаем на проблему с ToolTips. Или же можно избавиться вообще от affineTransform и использовать Ваш вариант, тогда получим тень, но кривоватую - собственно все мои affineTransform именно и возникли из-за желания нарисовать нечто хоть чуть более правдоподобное, чем просто серая буква смещенная на n пискселей.С ToolTips я уперся в проблему того, что я просто не понимаю, из-за чего тут-то возникает проблема?Ну, понятно, что для ускорения перерисовывается скорее всего область, перекрываемая ToolTips, таким образом, методу paint может быть дана команда на перисовку не всей обасти, а только части, что и приводит к косяку.Остается найти в моем коде место, где учитывается динамически изменяемая область рисования.Я пока найти так и не смог.Код package LSDlabels3D;import javax.swing.plaf.basic.BasicLabelUI;import javax.swing.plaf.basic.BasicGraphicsUtils;import javax.swing.plaf.LabelUI;import javax.swing.*;import java.awt.*;import java.awt.geom.AffineTransform;/public class LSD3DTransformUI extends BasicLabelUI { private static Rectangle paintIconR = new Rectangle(); private static Rectangle paintTextR = new Rectangle(); private static Rectangle paintViewR = new Rectangle(); private static Insets paintViewInsets = new Insets(0, 0, 0, 0); private static Color SColor= new Color(209,209,209); private int ShadowWidth= 3; public int setShadowWidth(int newWidth){ if (newWidth>3) { ShadowWidth = newWidth; return newWidth; } else return 3; } public int getShadowWidth(){ return ShadowWidth; } //Пока переопределенный метод ничего не делает - оставлен, т.к. рисование объемного //текста может потребовать чуть больше пространства, чем плоский текст public Dimension getPreferredSize(JComponent c) { Dimension dim = super.getPreferredSize(c); return (dim); } private void DrawTxt(String clippedText, Color newColor, JLabel label, Graphics g, int textX, int textY, int dx, int dy, boolean islblenabled) { if (islblenabled){ g.setColor(newColor); BasicGraphicsUtils.drawString(g,clippedText,label.getDisplayedMnemonic(), textX+dx,textY+dy); } else { g.setColor(label.getBackground()); BasicGraphicsUtils.drawString(g,clippedText,label.getDisplayedMnemonic(), textX+dx,textY+dy); } } public void paint(Graphics gr, JComponent c) { Graphics2D g= (Graphics2D)gr; JLabel label = (JLabel) c; String text = label.getText(); Icon icon = (label.isEnabled()) ? label.getIcon() : label.getDisabledIcon(); if ((icon == null) && (text == null)) { return; } FontMetrics fm = g.getFontMetrics(); //ОТ ОБЛАСТИ НЕ ЗВАИСИТ paintViewInsets = c.getInsets(paintViewInsets); //ОТ ОБЛАСТИ НЕ ЗАВИСИТ? //Учтем толщину бордюра (если он, конечно, есть у нашей метки) paintViewR.x = paintViewInsets.left; paintViewR.y = paintViewInsets.top; paintViewR.height = c.getHeight() - ShadowWidth; //ОТ ОБЛАСТИ НЕ ЗАВИСИТ paintViewR.width = c.getWidth() + ShadowWidth; paintIconR.x = paintIconR.y = paintIconR.width = paintIconR.height = 0; paintTextR.x = paintTextR.y = paintTextR.width = paintTextR.height = 0; String clippedText = layoutCL(label, fm, text, icon, paintViewR, paintIconR, paintTextR); if (icon != null) { icon.paintIcon(c, g, paintIconR.x, paintIconR.y); } if (text != null) { int textX = paintTextR.x + c.getX(); //А вот тут возможно что-то есть! Но не помогает. :( int textY = paintTextR.y + fm.getAscent() - ShadowWidth+c.getY(); Color oldColor = label.getForeground(); AffineTransform oldaft = g.getTransform(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); double dx= ShadowWidth*0.66; double dy= dx-0.1; //Сдвиг тени по оси Y всегда немного меньше, чем по оси X AffineTransform aft= AffineTransform.getTranslateInstance(dx,dy); g.setTransform(aft); DrawTxt(clippedText, new Color(150,150,150), label, g, textX, textY, 0, 0, label.isEnabled()); //DrawTxt(clippedText, Color.RED, label, g, textX, textY, 0, 0, label.isEnabled()); // g.setTransform(oldaft); - Работает очень странно g.setTransform(AffineTransform.getTranslateInstance(-dx,-dy)); //А так хорошо. DrawTxt(clippedText, new Color(200,200,200), label, g, textX, textY, 1, 1,label.isEnabled()); //А теперь рисуем сам текст DrawTxt(clippedText, oldColor, label, g, textX, textY, 0, 0, label.isEnabled()); g.setTransform(oldaft); //Можно и отключить, все равно ничего не дает // Подозреваю, что где-то я неверно трансформирую объект, точнее неправильно // возвращаю его к испходному состоянию } //end if }}highlightSyntax('javazY5YTB','java'); |