2015-11-05 3 views
0

У меня возникают проблемы с получением полупрозрачной рамки. Когда «alphaValue» - 255, все работает так, как ожидалось. Но мне нужна прозрачная рамка. Я создал небольшой тестовый класс ниже, который демонстрирует проблему. Как вы видите, прямоугольник «MIDDLE» появляется все время. Но прямоугольник «DRAW» появляется только тогда, когда «alphaValue» равен 255. Когда он равен < = 254, вы можете видеть по линиям печати, что метод все еще вызывается, но изображение не обновляется. Спасибо заранее за любую помощь.Java AWT Draw на прозрачной рамке

import java.awt.Color; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Panel; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class TransparencyTest { 
    private static Point startPoint = new Point(); 
    private static Point endPoint = new Point(); 

    public static void main(String[] args) { 
     new TransparencyTest().test(); 
    } 

    @SuppressWarnings("serial") 
    private void test() { 
     int alphaValue = 255; 

     Frame myFrame = new Frame(); 
     myFrame.setUndecorated(true); 
     myFrame.setBackground(new Color(0, 0, 0, alphaValue)); 
     myFrame.setSize(800, 800); 

     Panel myPanel = new Panel() { 
      public void paint(Graphics g) { 
       super.paint(g); 
       System.out.println("PAINT"); 
       g.setColor(new Color(255, 0, 0, 255)); 
       if(startPoint.equals(new Point())) { 
        System.out.println("MIDDLE"); 
        g.drawRect(200, 200, 400, 400); 
       } 
       else { 
        System.out.println("DRAW"); 
        g.drawRect(
          (int)Math.min(startPoint.getX(), endPoint.getX()), 
          (int)Math.min(startPoint.getY(), endPoint.getY()), 
          (int)Math.abs(startPoint.getX() - endPoint.getX()), 
          (int)Math.abs(startPoint.getY() - endPoint.getY()) 
        ); 
       } 
      } 
     }; 
     myFrame.add(myPanel); 

     MouseAdapter myMouseAdapter = new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       startPoint = e.getPoint(); 
      } 

      public void mouseDragged(MouseEvent e) { 
       endPoint = e.getPoint(); 
       myPanel.repaint(); 
      } 
     }; 
     myPanel.addMouseListener(myMouseAdapter); 
     myPanel.addMouseMotionListener(myMouseAdapter); 

     myFrame.setVisible(true); 
    } 
} 
+1

Вы также смешивая тяжелый вес и легкий вес компонентов, может рассмотреть возможность использования панели JPanel. Это может не решить эту проблему, но это предотвратит другие возможные проблемы. – MadProgrammer

+0

Не думаю, что у панели есть метод paintComponent. С альфа-значением 254 я бы подумал, что я все равно увижу рисованный прямоугольник вместо ничего. – Joe

+0

Использование компонента тяжелой массы, например 'Panel', может быть« частью »проблемы. Я бы поставил под вопрос, почему вы используете компоненты AWT напрямую – MadProgrammer

ответ

2

Компоненты AWT не имеют концепции прозрачности сами по себе, они всегда непрозрачны.

У вас есть JPanel, в котором вы используете setOpaque для управления непрозрачностью (с включением или выключением). Это позволит панель стать видеть сквозь, а затем вы должны быть в состоянии увидеть альфа-аффект применяется непосредственно к раме ... 

Transparent

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TransparencyTest { 

    private static Point startPoint = new Point(); 
    private static Point endPoint = new Point(); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       new TransparencyTest().test(); 
      } 
     }); 
    } 

    @SuppressWarnings("serial") 
    private void test() { 
     int alphaValue = 128; 

     JFrame myFrame = new JFrame(); 
     myFrame.setUndecorated(true); 
     myFrame.setBackground(new Color(0, 0, 0, alphaValue)); 
//  myFrame.setOpacity(0.1f); 
     myFrame.setSize(800, 800); 
     myFrame.setLocation(100, 100); 

     JPanel myPanel = new JPanel() { 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 

       System.out.println("PAINT"); 
       g.setColor(new Color(255, 0, 0, 255)); 
       if (startPoint.equals(new Point())) { 
        System.out.println("MIDDLE"); 
        g.drawRect(200, 200, 400, 400); 
       } else { 
        System.out.println("DRAW"); 
        g.drawRect(
          (int) Math.min(startPoint.getX(), endPoint.getX()), 
          (int) Math.min(startPoint.getY(), endPoint.getY()), 
          (int) Math.abs(startPoint.getX() - endPoint.getX()), 
          (int) Math.abs(startPoint.getY() - endPoint.getY()) 
        ); 
       } 
      } 
     }; 
     myPanel.setOpaque(false); 
     myFrame.add(myPanel); 

     MouseAdapter myMouseAdapter = new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       startPoint = e.getPoint(); 
      } 

      public void mouseDragged(MouseEvent e) { 
       endPoint = e.getPoint(); 
       myPanel.repaint(); 
      } 
     }; 
     myPanel.addMouseListener(myMouseAdapter); 
     myPanel.addMouseMotionListener(myMouseAdapter); 

     myFrame.setVisible(true); 
    } 
} 
+0

Вы, сэр, волшебник, и я хотел бы дать вам более одного голоса. – Joe

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