2012-10-06 9 views
5

Ho avuto un amico per fare uno sfondo per il programma che ho fatto in modo che non sembrasse così semplice, e ho pensato che il modo migliore per posizionare le immagini sarebbe per creare una JLabel, riempirla con un'immagine e impostarla sulla dimensione dello schermo. Questo ha funzionato bene, tranne che c'è un piccolo bordo attorno al JFrame e non riesco a far toccare a JLabel i bordi del frame. Pensieri? Ho allegato una foto.Come rimuovere JFrame Border per lasciare un'immagine Tocca il bordo

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

Sei sicuro che la dimensione dell'immagine corrisponda a quella dello schermo? Stai permettendo all'immagine di espandersi o contrarsi, se no? Prendi in considerazione la possibilità di creare e pubblicare un [sscce] (http://sscce.org) che mostri il tuo problema per noi. –

+0

'JLabel background = new JLabel (" Nuova etichetta "); \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

Si prega di non inserire il codice nei commenti poiché sono quasi illeggibili. Pubblicalo come una modifica alla tua domanda. Ma sembra che il codice che hai postato non stia espandendo l'immagine *, quindi non mi sorprende che tu abbia un confine. La risposta di Eng probabilmente funzionerà meglio, 1+ a lui. –

risposta

3

Per espandere la risposta di Eng.Fouad, ti consigliamo di utilizzare il metodo drawImage(...) che accetta 6 parametri, l'immagine, la posizione di xey, la larghezza e l'altezza dell'immagine e l'osservatore di immagini e la disegna così all'interno di un JPanel:

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

Ad esempio, il mio 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(); 
     } 
     }); 
    } 
} 

Modifica
vedo che si sta utilizzando un EmptyBorder intorno al contenuto Pane. Perché se non vuoi che questo confine sia presente?

+0

Grazie, provo questo. Come faccio a ottenere una BufferedImage dal file. Ne ho uno nel pacchetto. – flyinghigh

+0

@ user1419623: Puoi usare ImageIO.read che può prendere un InputStream, e puoi ottenere il File come InputStream chiamando 'getClass(). GetResourceAsStream (pathToImage)'. Nota che pathToImage sarà relativo ai file di classe. Questo è molto importante. –

+0

Sono un po 'confuso su come il tuo formato di esempio si adatta al mio formato. Ho postato il mio codice sopra con solo le linee necessarie (ovviamente), come puoi vedere sto creando fondamentalmente pannelli, pannelli e pannelli ... – flyinghigh

1

hai provato la funzione JFrame setUndecorated()?

+0

ma rimuoverà i pulsanti nella parte superiore della finestra per ... –

+0

Questo non lo fa. – flyinghigh

3

Il problema non è con il JFrame, il problema è con il tuo codice. Possiamo passare il resto della nostra vita naturale a indovinare cosa c'è che non va o pubblicare un codice di esempio.

Ora tocca a voi, siamo in grado di continuare a cercare di buttare indovinare sbagliato dopo sbaglia a voi, tutti noi frustrante, oppure è in grado di aiutarci ad aiutare ...

Ecco due esempi che ho fatto. Il primo utilizza uno JLabel come contenuto principale per uno JPanel, in cui sono posizionati i componenti figlio. Bello e semplice

Il secondo utilizza un numero personalizzato JPanel che dipinge l'immagine sullo sfondo del componente. Quindi lo uso per sostituire il riquadro del contenuto dei frame. Questo è un po 'più coinvolto, ma ha il vantaggio di essere facilmente aggiornato (che sostituisce il riquadro del contenuto non avrà effetto il resto del programma)

Esempio 1: JLabel utilizzato come sfondo

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); 

     } 
    } 
} 

Esempio 2: L'immagine utilizzata come sfondo, sostituendo riquadro del contenuto ...

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

Fare la cornice senza decorazione. frame.setUndecorated(true)

Se si desidera spostarlo, è possibile utilizzare lo ComponentMover di Java2S.

Assicurarsi che non sia decorato prima che sia visibile.

Avanti, utilizzare setContentPane(new JLabel(new ImageIcon("myimage.jpg")));

Dopo, che è possibile aggiungere contenuti, come al solito.

+0

Il collegamento al tuo blog non è sull'argomento preciso della domanda e non hai indicato che è il tuo blog a cui ti sei collegato. Sto rimuovendo il collegamento, in quanto non sembra rilevante per capire la tua risposta. Se lo aggiungi nuovamente, devi dichiarare che si tratta del tuo sito web e includere una descrizione del motivo per cui è * direttamente * correlato all'argomento della domanda. –