2013-11-14 4 views
0

Что я хочу сделать панель содержимого прозрачной и синей полоски обычного темного bluecolour. Но в процессе создания прозрачности прозрачности я также делаю эту полоску тусклой, (например, черный цвет окрашивается над ним).Нужна помощь в исправлении рисунка в моем маленьком Свинг-коде

enter image description here

Как я могу это исправить?

(Закомментируйте метод краски и обратите внимание на изменение в strip.This является то, что я хочу, как конечный результат)

Вот код:

class Home extends JFrame 
{ 
    int width=GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width; 
    int height=GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height; 
    public Home() 
    { 
     super("WiND"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setUndecorated(true); 
     setSize(width,height); 
     setBackground(new Color(0,0,0,0)); 
     setUndecorated(true); 
     setVisible(true); 
     setLayout(new FlowLayout()); 

     JPanel p=new JPanel(); 
     p.setBackground(new Color(0x0D70E8)); 
     p.setPreferredSize(new Dimension(width,height/10)); 
     add(p); 
    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     Graphics2D g2=(Graphics2D)g; 
     LinearGradientPaint p=new LinearGradientPaint(0,0,0,height,new float[]{0f,1f},new Color[]{new Color(0.2498f,0.2498f,0.2498f,0.3f),new Color(0.1598f,0.1598f,0.1598f,0.8f)}); 
     g2.setPaint(p); 
     g2.fillRect(0, 0, width,height); 
    } 
} 

(я это сделал то же самое, а год назад, но теперь через год я забыл, как я сделал это)

EDIT

Я сделал изменения к paint() только в соответствии с @ Sage.I получить следующий вывод Исправить синюю полосу, но теперь серый полупрозрачный фон исчез. enter image description here

+0

краски прозрачные цвета первого. Затем окрасьте непрозрачные цвета после. – Cruncher

+3

1) Для лучшей помощи раньше, отправьте сообщение [SSCCE] (http://sscce.org/).2) Вместо того, чтобы рисовать в контейнере верхнего уровня, таком как 'JFrame', добавьте' JPanel' и сделайте обычную картину в методе 'paintComponent (Graphics)'. Также верните разумный предпочтительный размер для настраиваемого компонента, чтобы помочь менеджеру макета. –

+0

@Cruncher: Как я могу это сделать? Я полагаю, что 'paint()' всегда будет вызываться потом. –

ответ

2
public void paint(Graphics g) 
    { 
     super.paint(g); 
     Graphics2D g2=(Graphics2D)g; 
     LinearGradientPaint p=new LinearGradientPaint(0,0,0,height,new float[]{0f,1f},new Color[]{new Color(0.2498f,0.2498f,0.2498f,0.3f),new Color(0.1598f,0.1598f,0.1598f,0.8f)}); 
     g2.setPaint(p); 
     g2.fillRect(0, 0, width,height); 
    } 

Когда вы рисуете с paint() функции вы рисуете с графикой, например g после детского компонента panel окрашена. Перейти к источнику функции super.paint(g) и вы увидите, что три последующая функция вызывается:

  • protected void paintComponent(Graphics g): это один красьте компонент, е, г:. Фон
  • protected void paintBorder(Graphics g): это один рисует границу компонента
  • protected void paintChildren(Graphics g): Это один окрашивает детей компонента в нем

Таким образом, после этого super.paint(g) вызова, либо вы рисуете появится над всей картины сделаны с т hese три функции выше: следовательно, над дочерними компонентами, для вашего контекста panel с синим фоном.

Теперь решение будет:

public void paint(Graphics g) 
{ 

      Graphics2D g2 = (Graphics2D)g.create(); 
       // note, we are creating a graphics object here for safe painting 
      LinearGradientPaint p=new LinearGradientPaint(0,0,0,height,new float[]{0f,1f},new Color[]{new Color(0.2498f,0.2498f,0.2498f,0.3f),new Color(0.1598f,0.1598f,0.1598f,0.8f)}); 
      g2.setPaint(p); 
      g2.fillRect(0, 0, width,height); 
      g2.dispose(); // disposing the object which we created 

      super.paint(g); 

    } 

Однако вместо того, чтобы делать это, вы используете класс такой как MyCanvas extends JComponent и переопределить его paintComponent(Graphics) функции и сделать внутри него. Затем вы можете установить экземпляр MyCanvas в качестве области содержимого JFrame, используя функцию setContentPane(component).

Отъезд A Closer Look at the Paint Mechanism


Редактировать Небольшой демо реализации Вашего случая использования:

class AMyContainer extends JComponent 
{ 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2 = (Graphics2D)g.create(); 
       // note, we are creating a graphics object here for safe painting 
      LinearGradientPaint p=new LinearGradientPaint(0, 0, 0, getHeight(),new float[]{0f,1f},new Color[]{new Color(0.2498f,0.2498f,0.2498f,0.3f),new Color(0.1598f,0.1598f,0.1598f,0.8f)}); 
      g2.setPaint(p); 
      g2.fillRect(0, 0, getWidth(), getHeight()); 
      g2.dispose(); // disposing the object which we created 
    } 

} 

class Home extends JFrame 
{ 
    int width=GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width; 
    int height=GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height; 
    public Home() 
    { 
     super("WiND"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setUndecorated(true); 
     setSize(width,height); 
     setBackground(new Color(0,0,0,0)); 
     setUndecorated(true); 

     JComponent container = new AMyContainer(); 
     container.setLayout(new FlowLayout()); 
     add(container); 

     JPanel p=new JPanel(); 
     p.setBackground(new Color(0x0D70E8)); 
     p.setPreferredSize(new Dimension(width,height/10)); 
     container.add(p); 
    } 



    public static void main(String[] args) 
    { 
     new Home().setVisible(true); 

    } 
} 
+0

@Stage: Это дает синий цвет по желанию, но теперь фон становится полностью прозрачным, который был ранее серым. –

+0

@ InsaneCoder, я все еще здесь. просто опубликуйте SSCCE, чтобы я понял текущую проблему и могу вам помочь. Когда вы закончите делать такой пример, просто поместите комментарий ниже – Sage

+0

См. EDIT –

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