2012-08-03 1 views
3

Java Swing 데스크톱 응용 프로그램 프로젝트에서 작업 중입니다. 응용 프로그램에는 약 15 개의 GUI 페이지가 있습니다. Layered Panes와 Tabbed Panes를 사용하여 모든 GUI 구성 요소를 한 클래스에 넣을 수 있습니다. 하지만 그 수업은 엄청 커질 것입니다. 프로젝트를 여러 개의 작은 하위 프로젝트로 나눌 수 있고 각각 하나 또는 몇 개의 GUI 페이지를 가질 수 있다면 좋을 것입니다. 각 하위 프로젝트를 개별적으로 작업하고 모든 하위 프로젝트가 완료되면 다시 한 응용 프로그램에 통합 할 수 있습니다. 제 질문은 다른 클래스의 모든 GUI 페이지를 통합하여 버튼을 클릭 할 때 여러 페이지로 돌아갈 수 있다는 것입니다. 하위 프로젝트에는 GUI 페이지가 있기 때문에 각 프로젝트에는 JFrame이 있어야합니다. JFrame 1과 JFrame 2 사이를 전환하여 강제로 표시하고 보이지 않게 만드는 방법은 무엇입니까? This question은 새 JFrames를 만드는 법을 보여줍니다. 그러나 JFrames간에 앞뒤로 전환하는 방법을 보여주지 않았습니다.다중 GUI 클래스에서 다중 페이지 Java Desktop 응용 프로그램을 통합하는 방법

+2

가난한 사용자에게 많은 수의 JFrames가 나오지 않아야합니다. 왜 단순히보기를 바꾸기 위해 CardLayout을 사용하지 않는가? –

+0

@Hovercraft 왜 여러 개의 JFrames GUI가 좋지 않습니까? 프로그램에 미치는 부정적인 영향은 무엇입니까? – David

답변

0

당신은 몇 가지 옵션이 있습니다

  1. 당신은 (거짓)로 setVisible와 이전 JFrame의를 숨길 수를
  2. 당신은 처분()

당신에게로 이전 JFrame의 제거 할 수 이 메소드들에 대한 정보와 여기에서 호출해야하는 정보를 얻을 수 있습니다 : http://docs.oracle.com/javase/6/docs/api/javax/swing/JFrame.html

희망이 있습니다.

+0

왜 사용자가 단일 JFrame에서보기를 교체하는 것이 더 낫다면 JFrames를 뒤집을 수 있습니까? CardLayout은이 문제를 해결하는 방법입니다. 때로는 가장 좋은 대답은 원래의 포스터가 요구하는 것을 해결하는 것이 아니라 프로그램의 행동에 대한 더 나은 솔루션을 제공하는 것입니다. –

+0

예를 들어, CardLayout을 사용하는 코드 예를 참조하십시오. –

4

귀하의 중앙 집중식 컨트롤러에 대한 아이디어는 좋지 않습니다.

개인적으로 저의 첫 번째 생각은 이러한 개별 페이지를 도메인 그룹 (또는 책임 그룹)으로 시도하는 것입니다. 이것은 나에게 나의 첫 번째 수준의 통제력을 줄 것이다. 나는이 도메인을 사용자가 어떻게 사용하고 싶은지 결정할 것이다.

그 작업이 있으면, 당신은 그룹을 사용하면 사용자가 등이

그리고 상호 작용하고자하는 방법 & (있는 경우) 서로 일을 다음 단계로 이동할 수 있습니다.

나는 HovercraftFullOfEels에 동의한다. 사용자에게 많은 창을 던지기를 원치 않는다. 단지 좌절감을 갖게된다. 관련 정보가있는 관련 페이지 사이를 가볍게 치지 않아도된다. 다른.

둘 다의 조합으로 끝날 수도 있습니다. 즉, 프레임에 일부 페이지를 여는 유연성을 사용자에게 제공해야 할 수도 있습니다. 이렇게하면 어떤 정보가 항상 필요한지를 결정할 수 있습니다. & 어떤 정보를 뒤집을 수 있습니다.

8

이럴 ... 응용 프로그램은 약 15 GUI 페이지가 있습니다. Layered Panes와 Tabbed Panes를 사용하여 모든 GUI 구성 요소를 한 클래스에 넣을 수 있습니다. 하지만 그 수업은 엄청 커질 것입니다.

반드시 그렇지는 않습니다. GUI는 매우 간단 할 수 있고, 다른 클래스가 페이지를 추가 할 수 있도록 해주는 방법을 가질 수 뭔가 registerPage(...)라는 말 :

public void registerPage(JComponent page, String name) { 
    pageHolder.add(page, name); 
    nameComboModel.addElement(name); 
} 

는 그 다음 클래스 메소드를 제공 한 다음 또는 이전 페이지로 이동 할 수 있도록 또는 무작위 페이지로.예를 들어이 같은 작은 클래스는 일할 수 :

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

public class LotsOfPagesPanel extends JPanel { 
    private CardLayout cardlayout = new CardLayout(); 
    private JPanel pageHolder = new JPanel(cardlayout); 
    private DefaultComboBoxModel<String> nameComboModel = new DefaultComboBoxModel<String>(); 
    private JComboBox<String> nameCombo = new JComboBox<String>(nameComboModel); 

    public LotsOfPagesPanel() { 
     JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     btnPanel.add(new JButton(new PrevAction(this, "Previous", KeyEvent.VK_P))); 
     btnPanel.add(new JButton(new NextAction(this, "Next", KeyEvent.VK_N))); 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.add(btnPanel); 
     bottomPanel.add(nameCombo); 

     nameCombo.addActionListener(new NameComboListener()); 
     pageHolder.setBorder(BorderFactory.createEtchedBorder()); 

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BorderLayout(5, 5)); 
     add(pageHolder, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    public void previousPage() { 
     cardlayout.previous(pageHolder); 
    } 

    public void nextPage() { 
     cardlayout.next(pageHolder); 
    } 

    public void show(String name) { 
     cardlayout.show(pageHolder, name); 
    } 

    public void registerPage(JComponent page, String name) { 
     pageHolder.add(page, name); 
     nameComboModel.addElement(name); 
    } 

    private class NameComboListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     String selection = nameCombo.getSelectedItem().toString(); 
     show(selection); 
     } 
    } 
} 

진짜로이 모든 클래스는 "페이지"에 대한 저장소로 행위이며 중 연속적으로 또는 무작위로 페이지를 틀지 수 있도록 논리를 가지고, 그리고 많은 그렇지 않으면, 그게 정말로 필요합니다. 그래서 그것을 제한함으로써, 우리는 클래스의 크기를 제한합니다. 다른 기능이 필요한 경우, 예를 들면 PrevAction 클래스를 포함하여 우리의 Action 클래스 이러한

다른 클래스를 ... 작성 :

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 

public class PrevAction extends AbstractAction { 
    private LotsOfPagesPanel lotsOfPages; 

    public PrevAction(LotsOfPagesPanel lotsOfPages, String name, Integer keyCode) { 
     super(name); 
     this.lotsOfPages = lotsOfPages; 
     putValue(MNEMONIC_KEY, keyCode); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     lotsOfPages.previousPage(); 
    } 
} 

및 NextAction.java

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 

public class NextAction extends AbstractAction { 
    private LotsOfPagesPanel lotsOfPages; 

    public NextAction(LotsOfPagesPanel lotsOfPages, String name, Integer keyCode) { 
     super(name); 
     this.lotsOfPages = lotsOfPages; 
     putValue(MNEMONIC_KEY, keyCode); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     lotsOfPages.nextPage(); 
    } 
} 

그리고 당신은 필요 물론 주된 방법을 가지고있는 것 :

import java.awt.Color; 
import java.awt.Dimension; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 

public class LotsOfPagesMain { 
    private static final String[] LABELS = { "One", "Two", "Three", "Four", 
     "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", 
     "Thirteen", "Fourteen", "Fifteen" }; 
    private static final Dimension LABEL_SIZE = new Dimension(400, 300); 

    private static void createAndShowGui() { 
     LotsOfPagesPanel lotsOfPages = new LotsOfPagesPanel(); 
     Random random = new Random(); 

     // I'm using JLabels as a simple substitute for your complex JPanel GUI "pages" 
     for (String labelText : LABELS) { 
     JLabel label = new JLabel(labelText, SwingConstants.CENTER); 
     label.setPreferredSize(LABEL_SIZE); 
     label.setOpaque(true); 
     label.setBackground(new Color(random.nextInt(170) + 85, random 
       .nextInt(170) + 85, random.nextInt(170) + 85)); 
     lotsOfPages.registerPage(label, labelText); 
     } 

     JFrame frame = new JFrame("LotsOfPages"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(lotsOfPages); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

그러나 거대한 클래스가 아니라면 y는 사용자가 여러 JFrames를 뒤집는 것에 대해 걱정할 필요가 없다는 것을 의미합니다.

+0

정말 바보 같은 의견에 대한 미안 ---> 훌륭한 아이디어 감사합니다 – mKorbel

관련 문제