2012-10-06 163 views
5

我有一位朋友爲我製作的程序製作背景,以便它看起來不那麼簡單,我認爲放置圖像的最佳方式是製作一個JLabel,用圖像填充它,並將其設置爲屏幕大小。這工作得很好,除了JFrame周圍有一個小邊框,並且我無法讓JLabel觸摸框架的邊緣。思考?我附上了一張照片。如何刪除JFrame邊框讓圖像觸摸邊緣

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

您確定圖像的大小與屏幕的大小相匹配嗎?你是否允許圖像擴大或縮小?考慮創建併發佈一個[sscce](http://sscce.org),向我們展示您的問題。 –

+0

'JLabel background = new JLabel(「New label」); (新的ImageIcon(ProgramDriver.class.getResource(「/ Pictures/GB_Blue.jpg」))); \t \t background.setBounds(0,0,652,496); \t \t Preferences.add(background);' – flyinghigh

+0

請不要在評論中張貼代碼,因爲它們近乎難以理解。發佈它作爲您的問題的編輯。但是,似乎你發佈的代碼似乎並沒有擴展* image *,所以我不覺得你有一個邊框。 Eng的答案可能會最好,1+給他。 –

回答

3

要擴展Eng.Fouad的答案,您將需要使用帶有6個參數,圖像,x和y位置,圖像寬度和高度以及圖像觀察者的drawImage(...)方法,並且可以從的JPanel:

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

例如,我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(); 
     } 
     }); 
    } 
} 

編輯
我看到你正在使用周圍的內容的EmptyBorder窗格。爲什麼如果你不想這個邊界存在?

+0

謝謝,要試試這個。如何從文件中獲取BufferedImage。我有一個在包中。 – flyinghigh

+0

@ user1419623:您可以使用ImageIO.read,它可以接受InputStream,並且可以通過調用getClass()。getResourceAsStream(pathToImage)'來獲得File作爲InputStream。請注意,pathToImage將相對於類文件。這個非常重要。 –

+0

我有點困惑,因爲你的示例格式如何適合我的格式。我已經發布了上面的代碼,只有必要的行(顯然),正如你所看到的,我基本上正在創建面板和麪板和麪板...... – flyinghigh

1

你試過JFrame函數setUndecorated()嗎?

+0

,但它會取消窗口頂部的按鈕... –

+0

這不行。 – flyinghigh

3

問題不在於JFrame,問題出在您的代碼上。我們可以花費剩餘的自然生活來猜測什麼是錯誤的,或者您可以發佈一些示例代碼。

現在是你的,我們可以不斷嘗試在你錯誤的猜測後拋出錯誤的猜測,折騰我們所有人,也可以幫助我們來幫助你......

這裏有兩個例子,我做到了。第一個使用JLabel作爲JPanel的主要內容,其中放置了子組件。很好很簡單。

第二個使用自定義JPanel,它將圖像繪製到組件的背景上。然後我用它來替換框架內容窗格。這是一個涉及多一點,但它有問題而容易地更新的附加益處(替換內容窗格不會影響該程序的其餘部分)

實施例1:JLabel用作背景

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

     } 
    } 
} 

實施例2:圖像用作背景,替換內容窗格...

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

使框架未修飾。 frame.setUndecorated(true)

如果您想使其移動,您可以使用Java2S的ComponentMover

確保它在未被修飾之前是可見的。

接下來,使用setContentPane(new JLabel(new ImageIcon("myimage.jpg")));

後,您可以添加內容如常。

+0

到您的博客的鏈接不是關於該問題的確切主題,而且您未指出它是您已鏈接到的自己的博客。我正在刪除鏈接,因爲它與理解您的答案似乎不相關。如果你重新添加它,你必須透露它是你的網站,並且包括一個爲什麼它直接與問題主題相關的描述。 –