JButton Прозрачность на BufferedImage - PullRequest
3 голосов
/ 12 сентября 2011

У меня проблема:

Я рендерил BufferedImage в JFrame. Затем я добавляю JButton в тот же кадр. когда я пытаюсь сделать кнопку прозрачной, кнопка становится прозрачной, но независимо от ее фактического положения, она всегда прозрачна, как будто она застряла в верхнем левом углу рамки. Я тестирую несколько разных способов сделать кнопку прозрачной, всегда с одинаковым результатом.

есть идеи?

спасибо

public class TestPanel extends JPanel {

public TestPanel(){
    JButton foo = new JButton("test");
    foo.setBackground(new Color(0, 0, 0, 0));
    foo.setBounds(20, 100, 300, 50);
    this.add(foo);
}

public void paint(Graphics g){
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(ImageFactory.getImg(), 0, 0, null); //get a BufferedImage
    g2.dispose();
}

}

Ответы [ 3 ]

7 голосов
/ 12 сентября 2011

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

  1. Ваш TestPanel не указывает LayoutManager (надеюсь, вы указываете его где-то еще в своем коде).
  2. Вы расширяете JPanel без вызова метода super paintComponent (не используйте paint). Вы должны сделать это раньше всего в вашем методе paintComponent:

    public void paintComponent(Graphics g){
        super.paintComponent(g); 
    }
    
  3. удалить вызов метода dispose. Вы не должны уничтожать свой графический объект.

EDIT:

  1. это проблема:

    foo.setBounds(20, 100, 300, 50);
    

    вы пытаетесь явно установить границы вашего JButton. Ты не должен этого делать. Если вы используете LayoutManager, он, вероятно, игнорирует эту директиву. Если вы используете пустой макет, это тоже может быть проблемой.

4 голосов
/ 12 сентября 2011

Несколько проблем

  • неправильно переопределять краску, вместо переопределения paintComponent
  • кнопка имеет полностью прозрачный фон, но возвращает true для непрозрачного, таким образом обманывая механизм рисования
  • неправильно распоряжаться графикой, переданной в качестве параметра

рабочий код (Правка: случайно удалена прозрачная строка настройки цвета, исправлено)

public TestPanel(){
    JButton foo = new JButton("test");
    foo.setBackground(new Color(0, 0, 0, 0));
    foo.setOpaque(false);
    foo.setBorder(BorderFactory.createLineBorder(Color.RED));
    this.add(foo);
}

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(ImageFactory.getImg(), 0, 0, null); //get a BufferedImage
   //   g2.dispose();
}

Как и другие ужеПримечание: LayoutManager'ы должны в Swing / AWT - их отсутствие делает код пользовательского интерфейса хрупким и сложным в обслуживании.

0 голосов
/ 12 сентября 2011

setBound() будет работать, только если вы установили макет на ноль. Ваш код не говорит ничего подобного. Теперь менеджер по умолчанию JPanel равен FlowLayout. По умолчанию этот менеджер компоновки расположит ваши компоненты слева направо, а затем сверху вниз.

Теперь, чтобы ваш код работал как положено. Добавьте эту строку внутри вашего конструктора: setLayout(null). Но помните, установка нулевого макета - очень плохая практика. Кроме того, пункты, упомянутые Гейзенбугом, очень достойны. Попробуйте следовать за ними.

...