2013-08-06 4 views
1

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

Часы (в типичной форме Java с прослушивателем событий и календарем) отлично работают. Предполагаемая настройка: Чтобы установить рамки Frame, ContentPane и Label на прозрачные, так что только время/текст показывает.

Что происходит в этом случае: Когда фон этикетки прозрачен (или до тех пор, пока он не станет достаточно непрозрачным, если установить значение «Альфа», когда «Непрозрачный» является истинным), базовый предыдущий дисплей останется и не очистится.

Чтобы понять это, я собрал следующий код - время и дата Материал календаря/etc исключен. Этот код является лишь одной версией многих, с которыми я пытался с/без непрозрачности, размещения вызовов ... и т. Д.

Что имеет значение, так это использование прослушивателя действий - если прослушиватель действий замечен/удален, отображение ярлыка прекрасное. Не комментируйте прослушиватель действий, и проблема возникает.

Посмотрите изображения ... Любая помощь оценена ... Спасибо!

FYI - ниже: импорт и комментарии код Санс ...

Скриншот часы с черным BG
enter image description here

Скриншот проблемы:
enter image description here

public class Clear extends JFrame { 
    private JPanel contentPane; 
    Color   ppColor = new Color(255, 255, 0, 0); // r,g,b,a 
    Color   lblColor = new Color(225, 200, 200, 0); 
    Color   lbl2Color = new Color(225, 200, 200, 254); 
    int   delay  = 1000; 
    JLabel   lblTime = new JLabel("TESTING"); 
    JLabel   lblTime2 = new JLabel("XXXXXX"); 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     try { 
      final Clear frame = new Clear(); 
      frame.setVisible(true); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     } 
    }); 
    } 

    public Clear() { 
    setUndecorated(true); 
    setBackground(ppColor); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(1680, 975, 128, 74); 

    contentPane = new JPanel(); 
    contentPane.setBackground(ppColor); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    lblTime.setOpaque(true); 
    lblTime.setBackground(lblColor); 
    lblTime.setBounds(0, 0, 125, 30); 
    contentPane.add(lblTime); 

    lblTime2.setOpaque(true); 
    lblTime2.setBackground(lbl2Color); 
    lblTime2.setBounds(0, 33, 125, 16); 
    contentPane.add(lblTime2); 

    ActionListener myTaskPerformer = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent evt) { 
     lblTime.setText("Does it"); 
     lblTime2.setText("work? "); 
     } 
    }; 
    new Timer(delay, myTaskPerformer).start(); 
    } 
} 

ответ

2

Компоненты Swing не очень хорошо работают с цветами на основе альфа. Они либо полностью прозрачны, либо полностью непрозрачны.

Если вы указываете, что компонент isOpaque, но заполните его с помощью полупрозрачного (альфа) цвета, диспетчер перерисовки не обновит область за компонентом, а контекст Graphics не будет очищен должным образом. Помните, что контекст Graphics является общим ресурсом, поэтому все, что было написано до вашего компонента, будет по-прежнему окрашено.

Для получения более подробной информации вы можете ознакомиться с Java Swing Graphical Glitches Dealing with Transparency and Images.

Однако. Простейшим решением было бы создать TranslucentPane, простирается от чего-то вроде JPanel, сделать его прозрачным (не непрозрачным), переопределить его paintComponent и нарисовать полупрозрачный (альфа) цвет изнутри. Затем добавьте свой ярлык на это.

Заканчивать Performing Custom Painting и Painting in AWT and Swing для получения более подробной информации

+0

Тот же вопрос с этикетками АВТ ... но я не сдаюсь ... Это связано с повторным обжигом метки в слушателем действий , у кого-то есть простое решение. Мне все равно, если он полностью прозрачен, он все равно не работает. Полностью непрозрачный, очевидно, работает, но прозрачным (частично или полностью) является моя цель. – headscratch

+0

Спасибо - я прочитаю ссылку и попробую ваше предложение. – headscratch

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