как установить JFrame фона прозрачным, но JPanel или JLabel Фон непрозрачный?

В соответствии с заданием мы должны создать средство просмотра изображений, как и Picasas. изображение в середине, полупрозрачный черный фон и изменение изображений с помощью кнопок влево / вправо.

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

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); JFrame f1 = new JFrame("ShowImage"); f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f1.setSize(dim); f1.setUndecorated(true); f1.setOpacity(0.5f); ShowImage panel = new ShowImage(); panel.setBackground(Color.black); f1.setContentPane(panel); f1.setVisible(true); 

Я пытался

 si.setOpaque(); si.setBackground(Color.black); si.setForeground(Color.red); 

никто не работал

когда я взял логическое и проверенное

 si.isDisplayable(); si.isVisible(); si.isShowing(); 

только видимый возвращает true, остальное – false, являются ли они одним из факторов?

Проблема в том, что ShowImage – это BorderLayout , это означает, что ваша панель ShowImage заполняет всю область кадра (черным цветом). Готов поспорить, если вы изменили фон ShowPane на красный. Он будет полностью заполнен красным

Теперь вы можете взглянуть на «Визуальное руководство для менеджеров макетов» или изменить способ работы ShowPane

ОБНОВИТЬ

Извинения, я не знаком с новым API-интерфейсом Transparency в Java 7 (все еще использую взломанный Java 6))

Прозрачная рамка

Можете ли вы проверить, что это тот эффект, который вы ищете? Если квадрат чтения будет изображением (а черный фон – рамкой – nb, я только захватил рамку)

ОБНОВИТЬ

Предварительный просмотр изображения

Сначала вы хотите прочитать Window.isOpaque и Window.setBackground, чтобы понять, как это решение работает.

Затем не используйте Window.setOpacity , он не достигнет того, чего вы хотите. Основная причина заключается в том, что значение непрозрачности применяется к родительскому и его детям (это через меня сначала).

Итак, код кадра:

 Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Make sure where in the top left corner, please lookup how // to find the screen insets ;) setLocation(0, 0); setSize(dim); // Set undecorated setUndecorated(true); // Apply a transparent color to the background // This is ALL important, without this, it won't work! setBackground(new Color(0, 255, 0, 0)); // This is where we get sneaky, basically where going to // supply our own content pane that does some special painting // for us setContentPane(new ContentPane()); getContentPane().setBackground(Color.BLACK); setLayout(new BorderLayout()); // Add out image pane... ShowImage panel = new ShowImage(); add(panel); setVisible(true); 

ContentPane . В принципе, нам нужно «обмануть» механизм рисования, подумав, где прозрачный (не непрозрачный), а затем нарисуйте нашу собственную непрозрачность

 public class ContentPane extends JPanel { public ContentPane() { setOpaque(false); } @Override protected void paintComponent(Graphics g) { // Allow super to paint super.paintComponent(g); // Apply our own painting effect Graphics2D g2d = (Graphics2D) g.create(); // 50% transparent Alpha g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); g2d.setColor(getBackground()); g2d.fill(getBounds()); g2d.dispose(); } } 

Мне жаль, мой ранний ответ, но я надеюсь, что это компенсирует это;)

UPDATE с кнопками

Вот как я его модифицировал

 ShowImage panel = new ShowImage(); panel.setBackground(Color.RED); setContentPane(new ContentPane()); getContentPane().setBackground(Color.BLACK); setLayout(new BorderLayout()); add(panel); JPanel pnlButtons = new JPanel(new FlowLayout(FlowLayout.RIGHT)); pnlButtons.setOpaque(false); pnlButtons.add(new JButton("<<")); pnlButtons.add(new JButton("<")); pnlButtons.add(new JButton(">")); pnlButtons.add(new JButton(">>")); // Okay, in theory, getContentPane() is required, but better safe the sorry getContentPane().add(pnlButtons, BorderLayout.SOUTH); setVisible(true); 

Образец с кнопками

  • Keylistener не работает для JPanel
  • Ошибка «Не удалось найти главный class» при запуске jar, экспортированного Eclipse
  • Swing - Обновить ярлык
  • SwingWorker не обновляет JProgressBar без Thread.sleep () в пользовательской диалоговой панели
  • Поиск общего метода для создания компонентов GridBagLayout
  • Трудности, связанные с пониманием механизма рендеринга JTable и JTree
  • Лучшая практика настройки местоположений JFrame
  • Java и GUI - Где ActionListeners принадлежат в соответствии с шаблоном MVC?
  • Заполнить JFreechart TimeSeriesCollection из Mysql DB?
  • Как генерировать исключения из RepaintManager
  • Создание пользовательской кнопки в Java с помощью JButton
  • Давайте будем гением компьютера.