Boas tardes,
eu já estive a pesquisar e já encontrei em alguns foruns ate neste esta pergunta, contudo não encontrei nenhuma resposta. Vou tentar explicar de melhor forma a minha duvida, eu tenho um JPanel, que altera de modo de janela para modo FullScreen, possuo ainda uma barra em que uma das opções é o de sair da aplicação. O problema acontece quando o JPanel encontra-se em exclusive mode, em que a minha JOptionPane aparece por trás da JPanel (isto acho que se deve devido a estar em fullscreen exclusive mode), eu gostaria de saber se existe alguma forma de resolver esta questão.
Uma das tentativas que fiz foi tentar meter o nome do JPanel no JOptionPane em vez de deixar a null, isto faz aparecer a janela do JOption, mas esta aparece “embutida” no JPanel.
Alguém por favor poderia-me ajudar?
sabe aquele primeiro parâmtetro do showMessageDialog?
JOptionPane.showMessageDialog(null,"Mensagem");
pois ele indica o pai da mensagem
sendo essa sua JPanel, com nome de painelTela por exemplo, para mostrar uma JOptionPane basta passar o painelTela para o JOptionPane:
JOptionPane.showMessageDialog(painelTela,"Mensagem");
isso vai fazer a mensagem aparecer sobre o painel, mesmo sendo em fullscreen.
EDIT: por acaso você não deveria fazer uma JFrame em fullscreen e colocar esse JPanel como content dela? Aí a JFrame seria o pai… Fiz isso certa vez e funcionou.
Agradeço desde já a tua ajuda,
Se colocar assim:
- JOptionPane.showMessageDialog(null,“Mensagem”);
Modo Janela: O JOptionPane aparece à frente do JPanel;
Modo FullScreen: O JOptionPane aparece atrás do JPanel;
se colocar :
- JOptionPane.showMessageDialog(painelTela,“Mensagem”);
Modo Janela: O JOptionPane aparece à frente do JPanel;
Modo FullScreen: O JOptionPane aparece à frente do JPanel, mas com erro isto é aparece só as opções e o nome da janela (sem estarem contidas na janela JOption) e quando tento clickar na janela para move-la esta desaparece
E então alguem tem alguma ideia?!
eu colocaria uma JFrame como pai, e não uma JPanel
Desculpa enganei-me no post anterior queria dizer JFrame não JPanel.
Segundo a pesquisa que fiz apenas encontrei mais ou menos duas respostas, aparentemente não se consegue meter um JOptionPane ou um Dialog a aparecer correctamente em FullScreen exclusive mode, uma vez que ira sempre aparecer por trás. Se isto o que acabei de dizer esta correcto, alguem sabe alguma forma de contornar a situação?
Uma das formas que me lembrei agora para resolver a situação é recorrer a um JInternalFrame que “emule” um JOptionPane, que acham desta solução?!
Simples (não importa se o JInternalFrame está em Fullscreen ou não):
A ideia do JInternalFrame era ele substituir o JOptionPane, uma vez que este aparece sempre atrás do JFrame em exclusive mode. Responderam-me no forum do java (para futura referencia para alguem com duvidas semelhantes):
http://forums.java.net/jive/thread.jspa?threadID=65572
Na resposta ele fala-me de glasspane,mas ainda não percebi muito bem isso, acham que irá substituir a minha ideia relativamente à JInternalFrame?
Veja bem, o GlassPane é um tipo de painel (um JPanel) o qual “cobre” o frame em questão (seja o JFrame ou JInternalFrame), é uma espécie de “vidro” mesmo, pode ser transparente ou ter uma cor de fundo mesmo, você pode usar ele por exemplo para impedir qualquer atividade no seu frame enquanto “algo” está sendo feito (por exemplo uma tarefa longa de consulta a um banco de dados).
Como eu ainda não entendi direito o que você pretente talvez o GlassPane resolva seu problema.
Segue um exemplo onde você instancia o objeto e associa ele ao frame que você quer cobrir, aí quando desejar você escolhe mostrar ou ocultar o GlassPane.
[code]import java.awt.AWTEvent;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Composite;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GlassPane extends JPanel implements AWTEventListener {
Window myParentWindow;
float[] BLUR = {0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.10f, 0.10f, 0.10f, 0.10f};
ConvolveOp blurOp = new ConvolveOp(new Kernel(3, 3, BLUR));
String message = "Aguarde... Processando.";
private javax.swing.JProgressBar progressBar;
boolean comFundo = true;
/**
* Construtor.
*/
public GlassPane() {
super();
config();
}
public GlassPane(boolean comFundo) {
super();
this.comFundo = comFundo;
config();
}
private void config() {
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
setBackground(Color.WHITE);
setOpaque(false);
if (!comFundo) {
}
addMouseListener(new MouseAdapter() {
});
this.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
progressBar = new javax.swing.JProgressBar();
progressBar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
progressBar.setString(message);
progressBar.setBackground(new Color(255, 255, 255));
javax.swing.GroupLayout painelGlassLayout = new javax.swing.GroupLayout(this);
this.setLayout(painelGlassLayout);
painelGlassLayout.setHorizontalGroup(painelGlassLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(painelGlassLayout.createSequentialGroup().addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 490, Short.MAX_VALUE).addGap(0, 0, 0)));
painelGlassLayout.setVerticalGroup(painelGlassLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelGlassLayout.createSequentialGroup().addContainerGap(203, Short.MAX_VALUE).addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(0, 0, 0)));
}
@Override
protected void paintComponent(Graphics g) {
// enables anti-aliasing
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// gets the current clipping area
Rectangle clip = g.getClipBounds();
// sets a 65% translucent composite
AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.65f);
Composite composite = g2.getComposite();
g2.setComposite(alpha);
// fills the background
g2.setColor(getBackground());
g2.fillRect(clip.x, clip.y, clip.width, clip.height);
g2.setComposite(composite);
super.paintComponent(g2);
}
@Override
public void setVisible(boolean aVisibleBoolean) {
if (aVisibleBoolean) {
if (this.myParentWindow == null) {
this.myParentWindow = SwingUtilities.windowForComponent(this);
}
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
} else {
//Lib.playSound(Lib.SOM_DING);
Toolkit.getDefaultToolkit().removeAWTEventListener(this);
}
super.setVisible(aVisibleBoolean);
}
public void setVisible(boolean aVisibleBoolean, String message) {
this.message = message;
progressBar.setString(message);
if (aVisibleBoolean) {
if (this.myParentWindow == null) {
this.myParentWindow = SwingUtilities.windowForComponent(this);
}
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
} else {
Toolkit.getDefaultToolkit().removeAWTEventListener(this);
}
super.setVisible(aVisibleBoolean);
}
public void eventDispatched(AWTEvent anEvent) {
if (anEvent instanceof KeyEvent && anEvent.getSource() instanceof Component) {
if (SwingUtilities.windowForComponent((Component) anEvent.getSource()) == this.myParentWindow) {
((KeyEvent) anEvent).consume();
}
}
}
} [/code]
No seu frame:
[code]GlassPane glassPane = new GlassPane();
…
setGlassPane(glassPane);
…
glassPane.setVisible(true, “Aguarde… Tarefa demorada em execução…”);
…
glassPane.setVisible(false);
[/code]
Espero ter ajudado.
WoWo o teu código esta brutal!!!
Obrigado pela ajuda embora não seja exactamente o que eu estava à procura irei “disseca-lo” de forma a entende-lo todo, porque esta brutal. Eu estou no 2º ano de engenharia informática, e tenho um grande interesse em interfaces e jogos, assim decidi fazer um jogo, como hobbie (a cadeira de interfaces só a vou ter agora no 3º ano dai as mil e uma duvidas). Relativamente à minha duvida original, eu estou a tentar meter o meu interface amigo do utilizador, utilizando para isso mensagens de confirmação, contudo ao usar fullscreen em modo exclusivo o JOptionPane deixa de ser uma opção e segundo o que estive a pesquisar a hipótese mais viável será usar uma JInternalFrame, neste momento estou a tentar ler sobre assunto. Isto porque embora ja a consigo adicionar, queria dar-lhe um aspecto igual à do sistema nativo, mas apesar dos códigos que aparecem ai na net no meu programa dá bug. Tambem pelo que li acho que existe problemas relativamente ao desempenho e tenho de ter uma JDesktopPane para o qual não irei ter muita necessidade. Como disse, ainda não tive aulas sobre isso, mas não gosto de estar parado e quero aprender o mais que puder, por isso desculpem a chatice.
Galera alguém descobriu como fazer isso com JOptionPane mesmo eu tentei aqui o q foi postado e até agora não consegui
Obrigado
[]s