Страницы

Поиск по вопросам

Показаны сообщения с ярлыком awt. Показать все сообщения
Показаны сообщения с ярлыком awt. Показать все сообщения

понедельник, 24 февраля 2020 г.

Как в Java сделать фигуру полупрозрачной? Есть ли встроенные методы для этого?

#java #графика #graphics #awt


Как в Java сделать фигуру полупрозрачной? Есть ли встроенные методы для этого?
Например, рисую круг и заливаю его красным цветом. Потом поверх него рисую прямоугольник,
больший по размеру и заливаю его, допустим, синим цветом. Необходимо поставить для
прямоугольника определенный уровень полупрозрачности для того, чтобы был виден и круг
под ним.
Возможно ли это сделать?  
    


Ответы

Ответ 1



Можно или установить цвету прозрачность, или, для более сложных случаев, использовать AlphaComposite public class Alpha { static void initUi() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE ); JPanel colorWithAlpha = new JPanel() { @Override public void paintComponent( Graphics g ) { g.setColor( Color.WHITE ); g.fillRect( 0, 0, getWidth(), getHeight() ); g.setColor( Color.RED ); g.fillOval( 0, 0, getWidth(), getHeight() ); // rgba, a - альфа-канал, непрозрачность g.setColor( new Color(0, 0, 255, 128) ); g.fillRect( 0, getHeight()/3, getWidth(), getHeight()/3 ); } }; JPanel alphaComposite = new JPanel() { @Override public void paintComponent( Graphics g ) { Graphics2D g2d = (Graphics2D)g.create(); try { g2d.setColor( Color.WHITE ); g2d.fillRect( 0, 0, getWidth(), getHeight() ); g2d.setColor( Color.RED ); g2d.fillOval( 0, 0, getWidth(), getHeight() ); // композит SrcOver отображает исходное изображение (src, // прямоугольник), поверх целевого изображения, с заданной // в derive( float ) alpha AlphaComposite composite = AlphaComposite.SrcOver.derive( 0.5f ); g2d.setComposite( composite ); g2d.setColor( Color.BLUE ); g2d.fillRect( 0, getHeight()/3, getWidth(), getHeight()/3 ); } finally { g2d.dispose(); } } }; JPanel content = new JPanel( new GridLayout( 1, 2 ) ); content.add( colorWithAlpha ); content.add( alphaComposite ); frame.setContentPane( content ); frame.setSize( 800, 600 ); frame.setVisible( true ); } public static void main(String[] args) throws IOException { EventQueue.invokeLater( Alpha::initUi ); } } Обучалка от Oracle по композитам

пятница, 24 января 2020 г.

Получение представления для сочетания клавиш

#awt #java


Допустим, у меня в приложении есть контрол, имеющий какой-либо KeyStroke. И у него
автоматически выставляется ToolTip в зависимости от системы. Например, на Windows это
текст вида Ctrl+Shift+Z, а на MacOS - ⌘⇧Z. Как получить эту строку для заданного сочетания
клавиш? 
P.S.
Интересует получение данной строки как с помощью AWT (или Swing).    


Ответы

Ответ 1



Смотрие в сторону KeyEvent.getKeyModifiersText, KeyEvent.getKeyText и KeyEvent.getKeyModifiersExText

суббота, 30 ноября 2019 г.

Тяжелые и легкие компоненты в Java

#java #swing #awt


Как можно лаконично и емко дать ответ на вопрос, что такое легкие и тяжелые компоненты,
в чем их различия, плюсы и минусы?
    


Ответы

Ответ 1



Если очень коротко, то: Тяжелые компоненты - это компоненты, которые имеют платформенно-зависимую реализацию. Легкие компоненты - это компоненты, полностью написанные на Java и не зависящие от peer-интерфейсов. Пояснение Приложения Java должны работать в любой, или хотя бы во многих графических средах. В связи с этим, требуется библиотека классов, независимая от конкретной графической системы, поэтому в JDK задачу решили следующим образом: были разработаны интерфейсы (также называются peer-интерфейсами), содержащие методы работы с графическими объектами. Классы библиотеки AWT (Abstract Window Toolkit) реализуют эти интерфейсы для создания приложений. Приложения Java используют данные методы для размещения и перемещения графических объектов, изменения их размеров, взаимодействия объектов. Для работы с экраном в конкретной графической среде эти интерфейсы реализуются отдельно для каждой. В каждой графической среде это делается по-своему: средствами этой оболочки (с помощью графических библиотек данной операционной системы). При выводе объекта, созданного в приложении Java и основанного на peer-интерфейсе, на экране создается парный ему (peer-to-peer) объект графической подсистемы операционной системы, который и отображается на экране. Эти объекты тесно взаимодействуют во время работы приложения. Поэтому графические объекты AWT в каждой графической среде имеют вид, характерный для этой среды и выглядят как "родные" окна. Начиная с версии JDK 1.1 библиотека AWT была переработана. В нее добавлена возможность создания компонентов, полностью написанных на Java и не зависящих от peer-интерфейсов. Такие компоненты стали называть "легкими" (lightweight) в отличие от компонентов, реализованных через peer-интерфейсы, названных "тяжелыми" (heavy). "Легкие" компоненты везде выглядят одинаково, сохраняют заданный при создании вид (look and feel). Более того, приложение можно разработать таким образом, чтобы после его запуска можно было выбрать какой-то определенный вид: Motif, Metal, Windows 95 или какой-нибудь другой, и сменить этот вид в любой момент работы. Эта интересная особенность "легких" компонентов получила название PL&F (Pluggable Look and Feel) или plaf. Была создана обширная библиотека "легких" компонентов Java, названная Swing. В ней были переписаны все компоненты библиотеки AWT, так что библиотека Swing может использоваться самостоятельно, несмотря на то, что все классы из нее расширяют классы библиотеки AWT. В данный момент Swing является основной библиотекой пользовательского интерфейса в Java, AWT - не дорабатывается. Использование библиотеки Swing - почти всегда предпочтительнее чем AWT, за исключением тех случаев, когда нужна обратная совместимость с Java 1.

воскресенье, 30 июня 2019 г.

Java, скроллинг

Пытаюсь с помощью функции setValue заставить вставать verticalScrollBar в нужное положение, все работает. Но в цикле почему-то нет.
JScrollPane sp = new JScrollPane(); JScrollBar verticalScrollBar = sp.getVerticalScrollBar(); while(iМожет, нужно как то обновлять полосу прокрутки?


Ответ

Попробуйте устанавливать положение скролла вот так:
sp.getViewport().setViewPosition(...);
И я рекомендую Вам почитать про создание анимации в Swing.
UPDATE: Вы что-то делаете не так, вот я не поленился, этот способ - работает:
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
public class Main extends JFrame {
public static void main(String[] args) throws Exception{ Main main = new Main(); main.setVisible(true); Thread.sleep(1000); main.animateScrollDown(); }
private final JScrollPane scrollPane = new JScrollPane(new SimpleComponent(750,1200));
private final Timer scrollTimer = new Timer(10, new TimerListener());
{ add(scrollPane); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(new Dimension(800, 600)); setLocationRelativeTo(null); }
private void animateScrollDown() { scrollTimer.start(); }
private class TimerListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JViewport viewport = scrollPane.getViewport(); Point viewPosition = viewport.getViewPosition(); viewPosition.y += 1; if (viewPosition.y > viewport.getView().getHeight() - viewport.getHeight()){ scrollTimer.stop(); } else { viewport.setViewPosition(viewPosition); } } }
private class SimpleComponent extends JComponent{
Dimension size;
public SimpleComponent(int width, int height){ size = new Dimension(width, height); setSize(size); setMinimumSize(size); setPreferredSize(size); setMaximumSize(size); }
@Override protected void paintComponent(Graphics g) { g.drawLine(0, 0, size.width, size.height); } } }

четверг, 21 марта 2019 г.

Копирование и вставка отформатированного текста

Есть небольшое desktop приложение, написанное на java. Я написал код, который позволяет работать из приложения с буфером обмена (т.е. копировать и вставлять текст). А как сделать так, чтобы моё приложение умело копировать в буфер (и доставать) отформатированный текст. То есть чтобы я мог применить шрифт, цвет, размер к тексту, потом скопировать его и вставить, например, в Word и текст был также отформатирован?


Ответ

Да-да. Кроме текста можно выставить mime-type, и тогда можно будет, например, класть text/html, так что ворд сможет получать форматированный текст. Например, как здесь: Copying HTML to the clipboard from Java

суббота, 16 марта 2019 г.

Получение представления для сочетания клавиш

Допустим, у меня в приложении есть контрол, имеющий какой-либо KeyStroke. И у него автоматически выставляется ToolTip в зависимости от системы. Например, на Windows это текст вида Ctrl+Shift+Z, а на MacOS - ⌘⇧Z. Как получить эту строку для заданного сочетания клавиш? P.S. Интересует получение данной строки как с помощью AWT (или Swing).


Ответ

Смотрие в сторону KeyEvent.getKeyModifiersText, KeyEvent.getKeyText и KeyEvent.getKeyModifiersExText