2012-10-06 112 views
5

Tenía un amigo que creaba un fondo para el programa que hice para que no se viera tan claro, y pensé que la mejor manera de colocar las imágenes sería para hacer un JLabel, llénelo con una imagen y ajústelo al tamaño de la pantalla. Esto funcionó bien, excepto que hay un borde pequeño alrededor del JFrame y no puedo hacer que el JLabel toque los bordes del marco. ¿Pensamientos? Adjunté una foto.Cómo quitar el borde JFrame como dejar que una imagen toque el borde

Border Problem

public class ProgramDriver extends JFrame { 

private JPanel contentPane; 
private static CardLayout cardLayout; 
private JTextField addGradeN; 
private JTextField addGradeD; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       ProgramDriver frame = new ProgramDriver(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

//Global Variables 
... 
    manager = new StateManager(gb); 

    //JFrame Settings 
    setTitle("Grade Book"); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setBounds(100, 100, 656, 530); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    cardLayout = new CardLayout(0,0); 
    contentPane.setLayout(cardLayout); 
    setResizable(false); 

    //Home Panel 
    final JPanel Home = new JPanel(); 
    contentPane.add(Home, "Home"); 
    Home.setLayout(null); 

    JButton btnSeeGrades = new JButton("See Grades"); 
    ... 

    //Grades Panel 
    JPanel Grades = new JPanel(); 
    contentPane.add(Grades, "Grades"); 
    Grades.setLayout(null);' 
+0

¿Está seguro de que el tamaño de la imagen coincide con el de la pantalla? ¿Estás permitiendo que la imagen se expanda o contraiga si no? Considere la posibilidad de crear y publicar un [sscce] (http://sscce.org) demostrando su problema para nosotros. –

+0

'JLabel background = new JLabel (" Nueva etiqueta "); \t \t background.setIcon (new ImageIcon (ProgramDriver.class.getResource ("/ Pictures/GB_Blue.jpg"))); \t \t background.setBounds (0, 0, 652, 496); \t \t Preferences.add (background); ' – flyinghigh

+0

No publique el código en los comentarios ya que están cerca de ser ilegibles. Publique como una edición de su pregunta. Pero parece que el código que ha publicado no parece expandir la * imagen *, así que no me sorprende que tenga un borde. La respuesta de Eng probablemente funcionará mejor, 1+ para él. –

Respuesta

3

Para ampliar la respuesta de Eng.Fouad, querrá usar el método drawImage(...) que toma 6 parámetros, la imagen, la ubicación xey, el ancho y alto de la imagen y el observador de imágenes, y dibujarlo como tal desde dentro de JPanel:

g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 

Por ejemplo, mi sscce:

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ExpandingImage extends JPanel { 
    public static final String GUITAR = "http://duke.kenai.com/Oracle/OracleStrat.png"; 
    BufferedImage img; 

    public ExpandingImage(String imgUrlPath) throws IOException { 
     URL imgUrl = new URL(imgUrlPath); 
     img = ImageIO.read(imgUrl); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (img != null) { 
     g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
     } 
    } 


    private static void createAndShowGui() { 
     ExpandingImage mainPanel; 
     try { 
     mainPanel = new ExpandingImage(GUITAR); 
     JFrame frame = new JFrame("ExpandingImage"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setVisible(true); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Editar
veo que estás usando una EmptyBorder todo el contenido Cristal. ¿Por qué si no quieres que este borde esté presente?

+0

Gracias, vamos a probar esto. ¿Cómo obtengo una imagen Buffered del archivo? Tengo uno en el paquete. – flyinghigh

+0

@ user1419623: Puede usar ImageIO.read, que puede tomar un InputStream, y puede obtener el archivo como un InputStream llamando a 'getClass(). GetResourceAsStream (pathToImage)'. Tenga en cuenta que pathToImage será relativo a los archivos de clase. Esto es muy importante. –

+0

Estoy un poco confundido sobre cómo su formato de ejemplo se ajusta a mi formato. He publicado mi código anterior con solo las líneas necesarias (obviamente), como puedes ver, básicamente estoy creando paneles, paneles y paneles ... – flyinghigh

1

¿Has probado la función JFrame setUndecorated()?

+0

pero quitará los botones en la parte superior de la ventana para ... –

+0

Eso no lo hace. – flyinghigh

3

El problema no está en el JFrame, el problema está en su código. Podemos pasar el resto de nuestra vida natural adivinando lo que está mal o podemos publicar un código de ejemplo.

Ahora le toca a usted, podemos seguir tratando de tirar suposición equivocada después suposición equivocada de ti, nos frustra, o puede ayudarnos a ayudarle ...

Éstos son dos ejemplos que hice. El primero usa un JLabel como contenido principal de JPanel, donde se colocan los componentes secundarios. Agradable y simple.

El segundo usa un JPanel personalizado que pinta la imagen en el fondo del componente. Luego uso esto para reemplazar el panel de contenido de marcos. Esto es un poco más complicado, pero tiene la ventaja añadida de estado de fácil actualización (en sustitución del panel de contenido no afectará al resto del programa)

Ejemplo 1: JLabel utilizar como fondo

JLabel as background

public class TestBackground { 

    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg"; 

    public static void main(String[] args) { 
     new TestBackground(); 
    } 

    public TestBackground() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setLayout(new BorderLayout()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new LabelPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

      } 
     }); 

    } 

    protected class LabelPane extends JPanel { 

     public LabelPane() { 

      BufferedImage bg = null; 
      try { 
       bg = ImageIO.read(new File(BACKGROUND_PATH)); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      JLabel label = new JLabel(new ImageIcon(bg)); 
      setLayout(new BorderLayout()); 

      add(label); 

      label.setLayout(new GridBagLayout()); 

      JLabel lblMessage = new JLabel("Look at me!"); 
      lblMessage.setForeground(Color.WHITE); 
      lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48)); 

      label.add(lblMessage); 

     } 
    } 
} 

Ejemplo 2: La imagen usada como fondo, en sustitución de panel de contenido ...

Background Content Pane

public class TestBackground { 
    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg"; 

    public static void main(String[] args) { 
     new TestBackground(); 
    } 

    public TestBackground() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setLayout(new BorderLayout()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setContentPane(new BackgroundPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    protected class BackgroundPane extends JPanel { 

     private BufferedImage bg = null; 

     public BackgroundPane() { 
      try { 
       bg = ImageIO.read(new File(BACKGROUND_PATH)); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      setLayout(new GridBagLayout()); 

      JLabel lblMessage = new JLabel("Look at me!"); 
      lblMessage.setForeground(Color.WHITE); 
      lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48)); 

      add(lblMessage); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(1153, 823); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (bg != null) { 
       g.drawImage(bg, 0, 0, this); 
      } 
     } 
    } 
} 
0

Hacer que el marco no esté decorado. frame.setUndecorated(true)

Si desea hacer que se mueva, puede utilizar el ComponentMover de Java2S.

Asegúrese de que esté sin decorar antes de que sea visible.

A continuación, utilice setContentPane(new JLabel(new ImageIcon("myimage.jpg")));

Después, que se puede añadir contenidos, como de costumbre.

+0

El enlace a su blog no trata sobre el tema preciso de la pregunta, y no ha indicado que es su propio blog al que se ha vinculado. Estoy eliminando el enlace, ya que no parece relevante para entender tu respuesta. Si lo vuelve a agregar, debe revelar que es su sitio web e incluir una descripción de por qué está * directamente * relacionado con el tema de la pregunta. –

Cuestiones relacionadas