Avatar billede saxtus Nybegynder
10. marts 2004 - 10:30 Der er 31 kommentarer og
1 løsning

Gennemsigtighed på JWindow

Jeg skal have lavet en splashscreen til mit program - det er egentligt nemt nok, men nu synes jeg at det kunne se godt ud hvis den var gennemsigtig.
Man skal kun kunne se det runde billede jeg har og så en tekst der svæver et stykke neden under.

Håber at det kan lade sig gøre.

Skriv hvis i vil se på dne kode jeg allerede har
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 10:34 #1
Prøv at lege lidt med dette eksempel:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.image.BufferedImage;

/**
* A demonstration of JFrame/JWindow transparency.
* Creates a draggable, transparent window.
*<p>
* Note: This demo assumes that the background image is static,
* which would not be true in the general case.
*
* @author R. Kevin Cole <cole@NoSpam.cfl.rr.com>
* 03/01/03
*/
//public class TransparentWindow extends JFrame
public class TransparentWindow extends JWindow
{
Dimension preferredSize = new Dimension(320,200);
public Dimension getMinimumSize() { return this.preferredSize; }
public Dimension getPreferredSize() { return this.preferredSize; }
protected int XDiff = 0;
protected int YDiff = 0;
protected static int xpos = 0;
protected static int ypos = 0;
protected static Robot    robot;

Image myImage;

public TransparentWindow() throws Exception
{
  super();

  ((JPanel) getContentPane()).setOpaque(false);
  setSize( getPreferredSize() );
  setBackground( Color.black );

  JPanel panel = (JPanel) getContentPane();
  panel.setBorder( new LineBorder( Color.white ) );
   
  // turn off double-buffering to reduce flicker in this demo
  // -not a good idea in the general case-
  RepaintManager.currentManager(null).setDoubleBufferingEnabled(false);

  addMouseMotionListener(new MyMouseMotionListener());
  robot = new Robot();

  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  Rectangle rec = new Rectangle();
  rec.setSize( screenSize );
  myImage = robot.createScreenCapture(rec);
}


public void paint( Graphics g )
{
  super.paint(g);

  if( myImage != null )
  {
  Dimension size = getSize();

  g.drawImage( myImage, 1, 1, size.width-2, size.height-2
      , xpos,ypos, xpos+size.width, ypos+size.height
      , null);
  }
}


public class MyMouseMotionListener extends MouseMotionAdapter
{
  public void mousePressed(MouseEvent evt)
  {
  XDiff = evt.getX() - xpos;
  YDiff = evt.getY() - ypos;
  if( XDiff < 0 ) XDiff = -XDiff;
  if( YDiff < 0 ) YDiff = -YDiff;
  }

  public void mouseDragged(MouseEvent e)
  {
  try
  {
    TransparentWindow.this.setLocation( xpos + (e.getX() - XDiff),
    ypos + (e.getY() - YDiff) );

    xpos = xpos + (e.getX() - XDiff);
    ypos = ypos + (e.getY() - YDiff);

    // force a repaint.
    TransparentWindow.this.invalidate();
    TransparentWindow.this.validate();
    TransparentWindow.this.repaint();
  } catch (Exception ex) { ex.printStackTrace(); }
  }
}

public static void main(String[] argv)  throws Exception
{
  TransparentWindow frame = new TransparentWindow();

  //Center the window
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  Dimension frameSize = frame.getSize();
  xpos = (screenSize.width - frameSize.width)/2;
  ypos = (screenSize.height - frameSize.height)/2;

  frame.setLocation(xpos,ypos);
  frame.setVisible(true);
    }
}

Link: http://groups.google.dk/groups?q=java+transparent+jframe&hl=da&lr=&ie=UTF-8&oe=UTF-8&selm=qo506v4bqd5csd1qg92i3bkdb6v325cth9%404ax.com&rnum=5
Avatar billede saxtus Nybegynder
10. marts 2004 - 10:56 #2
kan du ikke lige fjerne alt unødig kode i dit eksempel
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 11:03 #3
Hvad mener du med unødig kode?

Det var bare et eksempel, som viste hvordan man kan lave et transparent JWindow/JFrame.
Avatar billede saxtus Nybegynder
10. marts 2004 - 11:22 #4
jeg kigger lige på det
Avatar billede saxtus Nybegynder
10. marts 2004 - 11:31 #5
det kan jeg ikke få til at virke - det er vist et eller andet tegneting
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 11:35 #6
En tegneting?

Den laver da et transparent JWindow!
Du kan tage fat i JWindow'et og trække i det. Prøv det og du vil se, at det faktisk er nøjagtig det du spørger efter!
Avatar billede saxtus Nybegynder
10. marts 2004 - 11:56 #7
du kan lige se min kode:

package Kildekode.GUI;
import java.awt.*;
import javax.swing.*;
import layout.TableLayout;
import Kildekode.Forretningsmodel.*;

public class Start extends JWindow{
  private static Start instans;
  private JLabel LopretVare, LvareNr, Lmærke, LmodelNr, Ltype, Lleverandør, Lpris, Llocation, LvareTekst;
  private Container c;

  public Start(){
    double m = 5;
    double stoerrelse[][] = {{50, 385, 50},    //kol
                            {20, 181, 50, m}}; //række

    c = this.getContentPane();
    c.setLayout(new TableLayout(stoerrelse));
    c.setBackground(Color.white);

    //JLabels
    Icon ElectrikItIkon = new ImageIcon("ikoner\\Logo.gif");
    LopretVare = new JLabel(ElectrikItIkon);
    LvareNr = new JLabel();
    LvareNr.setFont(new Font("Verdana", 1, 16));
    LvareNr.setHorizontalAlignment(JTextField.CENTER);

    try{
      LvareNr.setText("Electric It - "+ServerForbindelse.hentInstans().openConn().Hello());
      LvareNr.setForeground(Color.black);
    }
    catch (Exception e){
      LvareNr.setText("Fejl - ingen Serverforbindelse!");
      LvareNr.setForeground(Color.red);
    }

    //Indsætning i layoutet
    c.add(LopretVare, " 1, 1");
    c.add(LvareNr, "1, 2");

    this.setSize(485, 270);
    Dimension dim = getToolkit().getScreenSize();
    Rectangle abounds = this.getBounds();
    this.setLocation((dim.width - abounds.width) / 2,
    (dim.height - abounds.height) / 2);
    show();
    }
   
  public void countDown(int sec){
    try{
      Thread.sleep(sec*1000);
      dispose();

    }
    catch(InterruptedException e)
    {
      System.out.println("Thread Interrupt");
    }
  }

  public static void main(String args[]){
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e){}

    Main.hentInstans();
    Start j = new Start();
    j.countDown(3);
    }
}

Det er så min hvide baggrund som bare skal gøres gennemsigtig
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 12:09 #8
Okay.

Du bliver nødt til at droppe at bruge layoutmanagers og give direkte koordinater i din paint metode.

Ta' mit eksempel og tilføj følgende i paint-metoden:

g.drawString("Copyright 2004", 50, 50);
g.drawImage(ElectrikItIkon.getImage(), 100, 100, this);

og tilpas det som det passer dig.

I tvivl så spørg!
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 12:12 #9
drawString i stedet for JLabel
og
drawImage i stedet for:

Icon ElectrikItIkon = new ImageIcon("ikoner\\Logo.gif");
LopretVare = new JLabel(ElectrikItIkon);

og:

c.add(LopretVare, " 1, 1");
c.add(LvareNr, "1, 2");
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 12:13 #10
Nej,

drawImage i stedet for:

LopretVare = new JLabel(ElectrikItIkon);

Dit imageicon skal stadig oprettes!
Avatar billede saxtus Nybegynder
10. marts 2004 - 12:57 #11
kan du ikke lave det for mig, så smider jeg lige 100 point mere på hvis jeg kan få det til at virke.
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 14:30 #12
Her er et udkast:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.image.BufferedImage;

public class Start extends JWindow
{
  private static Start instans;
  private ImageIcon ElectrikItIkon;
 
  private Dimension screenSize;
   
  private Dimension preferredSize;
 
  private Robot    robot;
 
  private Image myImage;
 
  public Start()
  {
    ElectrikItIkon = new ImageIcon("start.jpg");
   
    preferredSize = new Dimension(320,200);
    setSize( getPreferredSize() );
   
    ((JPanel) getContentPane()).setOpaque(false);
    setBackground( Color.black );

    JPanel panel = (JPanel) getContentPane();
    panel.setBorder( new LineBorder( Color.white ) );
   
    // turn off double-buffering to reduce flicker in this demo
    // -not a good idea in the general case-
    RepaintManager.currentManager(null).setDoubleBufferingEnabled(false);

    screenSize = getToolkit().getScreenSize();
    Rectangle abounds = this.getBounds();
    this.setLocation((screenSize.width - abounds.width) / 2, (screenSize.height - abounds.height) / 2);
   
    try
    {
      robot = new Robot();
    }
    catch (Exception ex)
    {
    }
   
    Rectangle rec = new Rectangle();
    rec.setSize( screenSize );
    myImage = robot.createScreenCapture(rec);
   
    show();
  }
 
  public Dimension getMinimumSize() { return this.preferredSize; }
  public Dimension getPreferredSize() { return this.preferredSize; }
 
  public void paint(Graphics g)
  {
      g.setColor(Color.black);
      g.setFont(new Font("Verdana", 1, 16));
     
      if( myImage != null )
    {
      // HER TEGNES DET TRANSPARANTE BILLEDE
      Point d = this.getLocationOnScreen();
      g.drawImage(myImage, (int)(0 - d.getX()), (int)(0 - d.getY()), (int)screenSize.getWidth(), (int)screenSize.getHeight(),this);
    }
   
      try
    {
      // HER ÆNDRER DU BARE KOORDINATERNE SÅ DE PASSER TIL DIG!!!
      g.drawString("Electric It - "/*+ServerForbindelse.hentInstans().openConn().Hello()*/, 25, 25);
    }
    catch (Exception e)
    {
      g.drawString("Fejl - ingen Serverforbindelse!", 25, 25);
    }
   
    // HER ÆNDRER DU BARE KOORDINATERNE SÅ DE PASSER TIL DIG!!!
    g.drawImage(ElectrikItIkon.getImage(), 25, 100, this);
  }
   
  public void countDown(int sec)
  {
    try
    {
      Thread.sleep(sec*1000);
      dispose();

    }
    catch(InterruptedException e)
    {
      System.out.println("Thread Interrupt");
    }
  }

  public static void main(String args[])
  {
    try
    {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e){}

    //Main.hentInstans();
    Start j = new Start();
    j.countDown(3);
    }
}

Det der sker i ovenstående er, at når du starte JWindow'et op, tages der et screenshot af skærmen. Dette screenshot ligges ind som baggrund og får det til at se transparent ud.

Flere spørgsmål - så spørger du bare!
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 14:37 #13
ElectrikItIkon = new ImageIcon("start.jpg");

skal lige ændres til:

ElectrikItIkon = new ImageIcon("ikoner/Logo.gif");

Og du kan selvfølgelig ændre størrelsen på vinduet her:

preferredSize = new Dimension(320,200);
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 14:42 #14
Og en lille ting mere:

g.drawString("Electric It - "/*+ServerForbindelse.hentInstans().openConn().Hello()*/, 25, 25);

skal være:

g.drawString("Electric It - "+ServerForbindelse.hentInstans().openConn().Hello(), 25, 25);

Jeg havde lige udkommenteret din serverforbindelse.
Avatar billede saxtus Nybegynder
10. marts 2004 - 16:03 #15
hvad gør den der robot??
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 16:05 #16
Det er den der tager et screenshot.

myImage = robot.createScreenCapture(rec);
Avatar billede saxtus Nybegynder
10. marts 2004 - 16:11 #17
hvad gør det godt for??

Jeg kan stadig kun få den til at lave en sort box hvor den smider mit logo ind i, og ikke en gennemsigtig ting
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 16:16 #18
Hmm. Det virker nu fint ved mig!

Nu ved jeg ikke hvordan dit logo ser ud, men hvis det er lige så stort som du laver JWindow'et, vil der jo ikke være noget transparant.

Du kan også bestemme hvor stort billedet skal være når du tegner det:

g.drawImage(image, x, y, width, height, imageobserver(this));
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 16:18 #19
Og mht. Robot, så tager den som sagt et screenshot af hele skærmen. Derefter bliver dette billede tegnet i dit JWindow, således at det ser ud som om det er transparent. Men i virkeligheden er det bare et screenshot der vises.
Jeg ved ikke hvordan jeg ellers lige skal forklare det.
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 16:25 #20
Det er selvfølgelig lidt en "snyde"-måde at gøre det på, men jeg mener ikke man kan gøre det på andre måder uden at skulle lave noget native.
Og når vinduet ikke skal vises mere end ca. 3-5 sekunder, synes jeg det er en ok løsning.
Avatar billede saxtus Nybegynder
10. marts 2004 - 16:43 #21
hvilken type compiler skal jeg bruge - for jeg kan ikke finde Robot i hverken 1.2 eller 1.4.1
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 16:47 #22
Den skulle gerne være med fra 1.3

Har du husket at importe alt fra mit eksempel?

Den ligger i awt pakken:

java.awt.Robot;
Avatar billede mikkelbm Nybegynder
10. marts 2004 - 17:18 #23
Har du fundet den?
Avatar billede saxtus Nybegynder
11. marts 2004 - 12:16 #24
den vil ikke så jeg tror at jeg opgiver
Avatar billede mikkelbm Nybegynder
11. marts 2004 - 16:58 #25
Det forstår jeg ikke! Det fungerer helt efter hensigten ved mig.

Er det stadig Robot den ikke kan finde?
Avatar billede saxtus Nybegynder
12. marts 2004 - 05:33 #26
Ja - og da jeg skiftede til 1.4.1 gik den helt amok så tilbage til 1.2 igen
Avatar billede mikkelbm Nybegynder
18. april 2004 - 10:21 #27
Er du kommet videre?
Avatar billede mikkelbm Nybegynder
18. maj 2004 - 17:41 #28
Lukketid?
Avatar billede mikkelbm Nybegynder
01. juli 2004 - 18:34 #29
??
Avatar billede saxtus Nybegynder
06. august 2004 - 11:42 #30
Nå er kommet langt videre nu - send et svar og få en masse point
Avatar billede mikkelbm Nybegynder
06. august 2004 - 11:44 #31
Jeg lægger et svar...

Hvad fandt du frem til?
Avatar billede saxtus Nybegynder
09. august 2004 - 09:25 #32
Det kan jeg dårligt huske

Mener at jeg lavede noget med et JWindow men er vist ikke helt sikker - er jo ret lang tid siden nu

men begyndte at bruge ver 1.42 alligevel - så kunne jeg nemlig også bruge png'er
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester