2010-03-07 2 views
0

Я пытаюсь наложить изображения поверх фонового изображения, используя стандартные утилиты java. См. Рисунки ниже ...Java JFrame pack() issue

У меня есть код, который, кажется, создает фоновое изображение (можете ли вы проверить, что он действительно работает?) И я создал расширение JPanel, которое я использую для отображения изображений (класс называемый ImagePanel)

Однако, когда программа запускается, JFrame показывает только второе изображение, которое затем перемещается по мере изменения размера окна.

Я бы хотел, чтобы окно было открыто с фоновым изображением, занимающим всю площадь окна. Затем я хотел бы, чтобы второе изображение отображалось сверху, в том месте, которое я указываю.

import javax.swing.*; 
import java.awt.*; 

public class ImageTest { 




public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.getContentPane().setLayout(null); 

    JPanel backgroundPanel = new JPanel(); 
    ImageIcon backgroundImage = new ImageIcon("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png"); 
    JLabel background = new JLabel(backgroundImage); 
    background.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight()); 
    frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE)); 
    backgroundPanel.setOpaque(false); 
    frame.setContentPane(backgroundPanel); 

    ImagePanel button = new ImagePanel("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\button.png"); 
    JPanel cardContainer = new JPanel(new FlowLayout()); 


    frame.getContentPane().add(cardContainer); 

    cardContainer.add(button); 
    cardContainer.setBounds(100, 600, 200, 200); 

    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

alt text http://img189.imageshack.us/img189/9739/image1qi.jpg

alt text http://img186.imageshack.us/img186/1082/image2ll.jpg

ответ

2

Вы можете установить предпочтительный размер фона панели размера изображения в:

backgroundPanel.setPreferredSize(new Dimension(
    backgroundImage.getIconWidth(), backgroundImage.getIconHeight())); 

Я хотел бы выступать следующий подход @ camickr в. Не имея ранее экспериментировал с setBounds() сам, вот простой пример, чтобы увидеть эффект:

import javax.swing.*; 
import java.awt.*; 

public class ImageTest { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     JLabel label = new JLabel(new ElliptIcon(380, 260, Color.red)); 
     label.setLayout(new GridLayout(2, 2)); 
     frame.setContentPane(label); 

     for (int i = 0; i < 4; i++) { 
      label.add(new JLabel(new ElliptIcon(100, 60, Color.blue))); 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static class ElliptIcon implements Icon { 

     private int w, h; 
     private Color color; 

     public ElliptIcon(int w, int h, Color color) { 
      this.w = w; 
      this.h = h; 
      this.color = color; 
     } 

     @Override 
     public void paintIcon(Component c, Graphics g, int x, int y) { 
      g.setColor(color); 
      g.fillOval(x, y, w, h); 
     } 

     @Override 
     public int getIconWidth() { return w; } 

     @Override 
     public int getIconHeight() { return h; } 
    } 
} 
+0

Снова зачем писать собственный код, чтобы нарисовать изображение и рассчитать предпочтительный размер панели? Это делается автоматически JLabel. JLabel - это контейнер, как JPanel. Таким образом, вы можете добавлять компоненты к нему так же легко, как и JPanel, и получаете бонус от фонового изображения. – camickr

+0

@camickr: Согласен.Я никогда не думал установить макет 'JLabel', и я обновил свой пример, чтобы показать, используя« GridLayout ». Вопросник может попробовать попробовать это с помощью StarLayout: http://mindprod.com/jgloss/starlayout.html – trashgod

3

Я хотел бы иметь окно открытым первоначально с фоновым изображением Подняв полноту пространства окна.

Затем просто создайте JLabel с иконкой и используйте метку в качестве области содержимого кадра Когда вы упаковываете фрейм, он будет принимать размер изображения.

я тогда хотел иметь второе изображение отображается на верхней части, в месте, которое указываю.

Используйте нулевой макет для вышеуказанного ярлыка. Теперь вы можете создать дополнительные JLabels с иконками и добавить их в панель содержимого и разместить их с помощью setBounds.

+0

какой-либо причине, почему вы должны использовать JLabel вместо из JPanel – Allen

+0

я просто изменил JPanel, удерживающий фоновое изображение, чтобы иметь нулевой макет, и это решило проблему получения второго изображения для наложения в моем выборе. Тем не менее, кадр по-прежнему открывается без какого-либо размера, какой-либо идеи, что я могу сделать? – Allen

+0

после некоторого возиться, похоже, что он действительно работает. спасибо за помощь – Allen

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