Estou desenvolvendo um aplicativo que exibe imagens e reproduz sons de um banco de dados. Estou tentando decidir se deve ou não usar um JFrame separado para adicionar imagens ao banco de dados da GUI.
Só estou me perguntando se é uma boa prática usar várias janelas do JFrame?
java
swing
user-interface
jframe
Mascate
fonte
fonte
Respostas:
Má prática (má, má).
Existem inúmeras maneiras de exibir muitos elementos em uma GUI, por exemplo:
CardLayout
( demonstração curta ). Bom para:JInternalFrame
/JDesktopPane
normalmente usado para um MDI .JTabbedPane
para grupos de componentes.JSplitPane
Uma maneira de exibir dois componentes cuja importância entre um ou outro (o tamanho) varia de acordo com o que o usuário está fazendo.JLayeredPane
muitos componentes bem ..layered.JToolBar
normalmente contém grupos de ações ou controles. Pode ser arrastado pela GUI ou totalmente fora dela, de acordo com a necessidade do usuário. Como mencionado acima, será minimizado / restaurado de acordo com os pais que o fazem.JList
(exemplo simples abaixo).JTree
.Mas se essas estratégias não funcionarem para um caso de uso específico, tente o seguinte. Estabeleça um único main e
JFrame
, em seguida, apareçaJDialog
ouJOptionPane
instâncias para o restante dos elementos flutuantes, usando o quadro como pai dos diálogos.Muitas imagens
Nesse caso, onde os vários elementos são imagens, seria melhor usar um dos seguintes itens:
JLabel
(centralizado em um painel de rolagem) para exibir a imagem em que o usuário estiver interessado naquele momento. Como visto emImageViewer
.JList
. Como visto nesta resposta . A parte 'linha única' só funciona se tiverem as mesmas dimensões. Como alternativa, se você estiver preparado para dimensionar as imagens em tempo real, e elas terão a mesma proporção (por exemplo, 4: 3 ou 16: 9).fonte
JFrame
segundos antes e nunca considerei esses problemas, obrigado por explicar!A
JFrame
abordagem múltipla foi implementada desde que comecei a programar aplicativos Swing. Na maioria das vezes, eu fiz isso no começo porque não conhecia melhor. No entanto , à medida que amadureci em minha experiência e conhecimento como desenvolvedor e comecei a ler e absorver as opiniões de tantos desenvolvedores Java mais experientes on-line, tentei me afastar daJFrame
abordagem múltipla (nos projetos atuais e nos projetos futuros ) apenas para encontrar ... obter essa ... resistência dos meus clientes! Quando comecei a implementar diálogos modais para controlar janelas "filho"JInternalFrame
es para componentes separados, meus clientes começaram a reclamar!Fiquei bastante surpreso, pois estava fazendo o que achava ser a melhor prática! Mas, como se costuma dizer, "uma esposa feliz é uma vida feliz". O mesmo vale para seus clientes. Obviamente, eu sou um contratado para que meus usuários finais tenham acesso direto a mim, o desenvolvedor, o que obviamente não é um cenário comum.Então, vou explicar os benefícios da
JFrame
abordagem múltipla , bem como rebentar com os mitos, alguns dos contras que outros apresentaram.JFrame
s separados , você oferece ao usuário final a capacidade de se espalhar e controlar o que está na tela dele. O conceito parece "aberto" e não restritivo. Você perde isso quando vai em direção a um grandeJFrame
e um monte deJInternalFrame
s.JFrame
s. No entanto, eu queria que a tela de entrada de dados fosseJDialog
cujo pai fosse o visualizador de dados. Fiz a alteração e imediatamente recebi uma ligação de um usuário final que confiava muito no fato de ele poder minimizar ou fechar o visualizador e manter o editor aberto enquanto ele referenciava outra parte do programa (ou site, eu não lembre-se). Ele não está em um monitor múltiplo, então ele precisava que a caixa de diálogo de entrada fosse a primeira e outra coisaser o segundo, com o visualizador de dados completamente oculto. Isso era impossível com umJDialog
e certamente também seria impossível com umJInternalFrame
. Eu relutantemente mudei de volta para ser separadoJFrames
por sua sanidade, mas isso me ensinou uma lição importante.JInternalFrame
que umJFrame
. De fato, na minha experiência,JInternalFrames
ofereço muito menos flexibilidade. Eu desenvolvi uma maneira sistemática de lidar com a abertura e o fechamento deJFrame
s nos meus aplicativos que realmente funcionam bem. Eu controlo o quadro quase completamente de dentro do próprio código do quadro; a criação do novo quadro,SwingWorker
s que controlam a recuperação de dados nos encadeamentos em segundo plano e o código da GUI no EDT, restaurando / trazendo para a frente o quadro se o usuário tentar abri-lo duas vezes etc. Tudo o que você precisa para abrir meusJFrame
s é chamar um método estático públicoopen()
e o método aberto, combinado com umwindowClosing()
O evento lida com o restante (o quadro já está aberto? Não está aberto, mas está carregando? etc.) Fiz essa abordagem como um modelo para que não seja difícil de implementar para cada quadro.JFrame
precisa de mais espaço que umJInternalFrame
, mesmo que você abra 100JFrame
s, quantos recursos mais você realmente consumiria? Se sua preocupação é com vazamentos de memória devido a recursos: a chamadadispose()
libera todos os recursos usados pelo quadro para coleta de lixo (e, mais uma vez digo, umJInternalFrame
deve chamar exatamente a mesma preocupação).Escrevi muito e sinto que poderia escrever mais. De qualquer forma, espero não ser rebaixado simplesmente porque é uma opinião impopular. A pergunta é claramente valiosa e espero ter fornecido uma resposta valiosa, mesmo que não seja a opinião comum.
Um ótimo exemplo de vários quadros / documento único por quadro ( SDI ) versus quadro único / vários documentos por quadro ( MDI ) é o Microsoft Excel. Alguns dos benefícios do MDI:
SDI (interface de documento único, ou seja, todas as janelas podem ter apenas um único documento):
MDI (Multiple-Document Interface, ou seja, todas as janelas podem ter vários documentos):
fonte
JFrame
e um grande paiJTabbedPane
; mas com a possibilidade de abrir uma segunda janela (ou até mais) em que o layout possa ser diferente, oferecendo, portanto, um comportamento híbrido no qual os amantes de SDI são felizes e os de MDI também. Em todos os casos, sempre considereiJInternalFrame
um padrão horrível que lhe dá todos os inconvenientes dos dois mundos. A flexibilidade que eles oferecem é uma porcaria e eles consomem muito espaço precioso na tela sem propósitos reais.JFrame
tem seu próprio ícone na barra de tarefas. Às vezes é exatamente isso que você deseja, mas às vezes não é. No WinAPI, isso é fácil de configurar, mas no Swing parece que não pode ser feito.JDialog
mais de umJFrame
.Eu gostaria de combater o argumento "não amigável" com um exemplo com o qual acabei de me envolver.
Em nossa aplicação, temos uma janela principal onde os usuários executam vários 'programas' como guias separadas. Tanto quanto possível, tentamos manter nosso aplicativo nessa única janela.
Um dos 'programas' executados apresenta uma lista de relatórios gerados pelo sistema, e o usuário pode clicar em um ícone em cada linha para abrir uma caixa de diálogo do visualizador de relatórios. Este visualizador está mostrando o equivalente às páginas A4 retrato / paisagem do relatório, para que os usuários gostem dessa janela como sendo bastante grande, quase preenchendo suas telas.
Alguns meses atrás, começamos a receber solicitações de nossos clientes para tornar essas janelas do visualizador de relatórios sem modelagem, para que eles pudessem ter vários relatórios abertos ao mesmo tempo.
Por algum tempo, resisti a esse pedido, pois não achei que fosse uma boa solução. No entanto, minha mente mudou quando descobri como os usuários estavam contornando essa 'deficiência' do nosso sistema.
Eles estavam abrindo um visualizador, usando o recurso 'Salvar como' para salvar o relatório como PDF em um diretório específico, usando o Acrobat Reader para abrir o arquivo PDF e, em seguida, fariam o mesmo no próximo relatório. Eles teriam vários leitores Acrobat sendo executados com as várias saídas de relatório que desejavam examinar.
Então, cedi e fiz com que o visualizador não fosse modelado. Isso significa que cada visualizador possui um ícone na barra de tarefas.
Quando a última versão foi lançada para eles na semana passada, a resposta esmagadora deles é que eles ADORAM. Esse foi um dos aprimoramentos recentes mais populares do sistema.
Então vá em frente e diga aos usuários que o que eles querem é ruim, mas, no final das contas, isso não fará nenhum favor a você.
ALGUMAS NOTAS:
ModalityType
e não o booleanomodal
. É isso que dá a essas caixas de diálogo o ícone da barra de tarefas.fonte
Faça um jInternalFrame no quadro principal e torne-o invisível. Então você pode usá-lo para outros eventos.
fonte
Já faz um tempo desde a última vez que toco no swing, mas em geral é uma prática ruim fazer isso. Algumas das principais desvantagens que vêm à mente:
É mais caro: você terá que alocar muito mais recursos para desenhar um JFrame que outro tipo de contêiner de janela, como Dialog ou JInternalFrame.
Não é fácil de usar: não é fácil navegar para um monte de JFrame juntos, parecerá que seu aplicativo é um conjunto de aplicativos inconsistentes e com design inadequado.
É fácil usar o JInternalFrame Isso é meio retórico, agora é muito mais fácil e outras pessoas são mais inteligentes (ou com mais tempo livre) do que nós já pensamos no padrão Desktop e JInternalFrame, então eu recomendaria usá-lo.
fonte
JInternalFrame
também? Pessoalmente, eu discordo do uso deJInternalFrame
's!CardLayout
é uma verdadeira benção!JInternalFrame
não oferece vantagens em nenhum dos três casos que você mencionou (1. onde está a evidênciaJInternalFrame
mais clara queJFrame
? 2. SeusJInternalFrame
s podem ser tão confusos / bagunçados / presos como um monte deJFrame
s. 3. Como éJInternalFrame
mais fácil? mesmo código exato, exceto um está contido em umJDesktopPane
e um é contido dentro da área da tela naturais soam igualmente complexas para mim)..JComponent
s, ambos têm estruturas quase idênticas, exceto que um é renderizado em umJDesktop
e outro não. Mais uma vez, desculpe, mas acredito que você está especulando sobre o "peso" deJFrame
. 2. Meus aplicativos usam SDI e meus clientes estão muito felizes. No entanto, você disse "uma tonelada de janelas", o que, é claro, seria péssimo. Mas, meu argumento é o seguinte: "uma tonelada de"JInternalFrame
s seria tão ruim quanto! Se você está dizendo que as JIFs permitem que você seja um designer de interface de usuário desleixado, isso é terrível. Uma bagunça desordenada é uma bagunça desorganizada, seja JF ou JIF.Má prática definitivamente. Um dos motivos é que ele não é muito "fácil de usar", pois cada
JFrame
um mostra um novo ícone da barra de tarefas. Controlar váriosJFrame
s fará com que você rasgue seu cabelo.Pessoalmente, eu usaria o ONE
JFrame
para seu tipo de aplicativo. Métodos de exibição de várias coisas são com você, existem muitos.Canvas
es,JInternalFrame
,CardLayout
, mesmoJPanel
é possivelmente.Vários objetos JFrame = Dor, problemas e problemas.
fonte
Eu acho que usar múltiplos
Jframe
s não é uma boa ideia.Em vez disso, podemos usar
JPanel
s mais de um ou maisJPanel
da mesma formaJFrame
.Também podemos alternar entre estes
JPanel
s. Por isso, nos dá liberdade para exibir mais do que as coisas noJFrame
.Para cada um
JPanel
, podemos projetar coisas diferentes e tudo issoJPanel
pode ser exibido emJFrame
um único de cada vez.Para alternar entre esta
JPanel
s usoJMenuBar
comJMenuItems
para cadaJPanel
ou 'JButtonfor each
JPanel`.Mais de um
JFrame
não é uma boa prática, mas não há nada errado se queremos mais de umJFrame
.Mas é melhor mudar um
JFrame
para nossas diferentes necessidades, em vez de ter váriosJFrame
s.fonte
Se os quadros tiverem o mesmo tamanho, por que não criar o quadro e passar o quadro como referência a ele?
Quando você passar o quadro, poderá decidir como preenchê-lo. Seria como ter um método para calcular a média de um conjunto de figuras. Você criaria o método repetidamente?
fonte
Não é uma boa prática, mas mesmo que você deseje usá-lo, pode usar o padrão singleton como bom. Eu usei os padrões singleton na maior parte do meu projeto, é bom.
fonte