Java фон JFrame с Jpanel, упорядочивающий изображения в сетке
Поэтому я работал над своей программой, и у меня возникли проблемы с настройкой JFrame с фоновым изображением карты сети, а затем с настройкой JPanel с помощью MigLayout поверх JFrame, что позволит мне размещать изображения в соответствии с карта сети. Я видел несколько разных способов, как установить фоновое изображение, и попытался использовать пример, который я нашел в другом месте на этом сайте, но он не совсем работает. Кроме того, я исследовал больше этого и обнаружил, что наличие JPanel поверх JFrame может помешать видеть фоновое изображение JFrame. Я надеялся, что кто-нибудь может взглянуть на мой код и сообщить мне, если это так.
Вот мой класс для установки фона:
public class bwMonBackground extends JFrame {
Image img;
public bwMonBackground() {
try {
img = ImageIO.read(new File("/Users/pwopperer/workspace/BWmon/src/customer_vlans.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void paintComponent(Graphics g)
{
super.paintComponents(g);
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
Вот мой главный:
public class bwMonBackgroundMain {
public static void main( String[] args )
{
bwMonBackground frame = new bwMonBackground();
frame.setLayout(new FlowLayout(FlowLayout.LEFT,10,20));
migLayout testing = new migLayout();
frame.add(testing.createLayout());
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
}
}
РЕДАКТИРОВАТЬ: Когда я запускаю это так, я получаю JPanel только с 6 JLabels, которые я добавил в него
1 ответ
Это было немного придирчиво, но вы всегда должны звонить super.paintComponent
если у вас нет ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО веской причины не делать этого.
Также вы должны предоставить Graphics.drawImage
с ImageObserver
где возможно. В основном это означает, что если обработка изображения происходит в другом потоке, ImageObserver не будет уведомлен об изменениях и обновится автоматически;)
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
}
При размещении компонентов на карте необходимо убедиться, что они прозрачны (JComponent.setOpaque(false)
). Это позволит фону просвечивать.
Очевидно, что вы можете выбрать некоторые компоненты, чтобы они были непрозрачными, чтобы их было легче читать или предоставлять AlphaComposite
s, чтобы обеспечить полупрозрачные эффекты.
Дополнительные идеи
Я бы не переопределил JFrame
таким образом. Кадры имеют панели контента, которые отвечают за основной контент.
Кроме того, по памяти, JFrame
не имеет paintComponent
метод:P
Я бы вместо этого переопределил JPanel
(или же JComponent
) и пользователь там paintComponent
Вместо этого, либо добавьте эту панель на панель содержимого фреймов, либо установите ее как саму панель содержимого (frame.setContentPane(...)
- просто будьте осторожны, вы делаете это ПЕРЕД добавлением любых других компонентов в фрейм, так как это эффективно удалит их из пользовательского интерфейса;))