2016-12-17 15 views
-1

Я изучаю Java и, хотя, как хорошую практику, я мог бы создать простую графическую программу.Как сделать эту программу несколько оконной?

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

У меня есть все мои компоненты, как я их тоже хочу. У меня 4 панели searchPanel, readPanel, writePanel и mainMenuPanel они отображаются на главном экране JFrame.

Теперь, что я хочу сделать (вот где я мог бы реально помочь вашим парням), как сделать эту программу несколько оконной?

i.e если я нажму кнопку чтения в mainMenuPanel, он отобразит readPanel. и так далее с другими кнопками.

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

Это мой код:

package MyGUIStuff; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.Scanner; 

public class multiWinDemo { 

    public static void main (String args []) { 
     /* Search Panel Ingredients 
     * Label : File Name 
     * TextField : look for ... 
     * Button - Search 
     * Button - Back 
     * TextArea - Results found ... 
     */ 
     JLabel fileNameStorage1 = new JLabel ("File Name"); 
     JTextField searchFor = new JTextField (20); 
     JButton searchBtnPanel = new JButton ("Search:"); 
     JButton backButton1 = new JButton ("Back"); 
     JTextArea searchedArea = new JTextArea ("Text Area Here!\nName : Misael\nIf this worked\nthen i should\nbe able to\nuse JScrollPane\ncorrectly", 5,20); 
     searchedArea.setEditable(false); 
     //searchedArea.setPreferredSize(new Dimension(100,100)); 
     JScrollPane searchedAreaScoller = new JScrollPane (searchedArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

     /* Write Panel Ingredients 
     * Label : File Name 
     * TextField : write this text to file ... 
     * Button : Write 
     * Button : Back 
     */ 
     JLabel fileNameStorage2 = new JLabel ("File Name:"); 
     JTextField writeThis = new JTextField (20); 
     JButton writeButton = new JButton ("Write"); 
     JButton backButton2 = new JButton ("Back"); 

     /* Read Panel Ingredients 
     * Label : File Name 
     * Button - Back 
     * TextArea - File That I Chose 
     */ 
     JLabel fileNameStorage3 = new JLabel ("File Name Here"); 
     JButton backButton3 = new JButton ("Back"); 
     JTextArea readTextArea = new JTextArea ("Text Area Here" ,5 , 20); 
     readTextArea.setEditable(false); 
     JScrollPane readScrollPane = new JScrollPane (readTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); 

     /* Main Menu Panel Ingredients 
     * Label : "File Name" 
     * TextField : File Absolute Path 
     * Button - Browse 
     * Button - Search 
     * Button - Write 
     * Button - Read 
     * Button - Exit 
     */ 
     JLabel lbl1 = new JLabel ("File Name:"); 
     JTextArea howTo = new JTextArea ("Search: Search a text file.\nWrite: Write to a text file.\nRead: Read a text file.", 3, 20); 
     howTo.setEditable(false); 
     JTextField filePath = new JTextField (20); 
     JButton browseBtn = new JButton ("Browse"); 
     JButton searchBtn = new JButton ("Search"); 
     JButton writeBtn = new JButton ("Write"); 
     JButton readBtn = new JButton ("Read"); 
     JButton exitBtn = new JButton ("Exit"); 

     //Search Panel 
     JPanel searchPanel = new JPanel(); 
     //searchPanel.setLayout(new GridLayout (3,9,5,5)); 
     searchPanel.setVisible(false); 
     searchPanel.add(fileNameStorage1); 
     searchPanel.add(searchFor); 
     searchPanel.add(backButton1); 
     searchPanel.add(searchBtnPanel); 
     searchPanel.add(searchedAreaScoller); 

     //Write Panel 
     JPanel writePanel = new JPanel(); 
     //writePanel.setLayout(new GridLayout (3,9,5,5)); 
     writePanel.setVisible(false); 
     writePanel.add(fileNameStorage2); 
     writePanel.add(writeThis); 
     writePanel.add(backButton2); 
     writePanel.add(writeButton); 

     //Read Panel 
     JPanel readPanel = new JPanel(); 
     //readPanel.setLayout(new GridLayout (3,9,5,5)); 
     readPanel.setVisible(false); 
     readPanel.add(fileNameStorage3); 
     //readPanel.add(readTextArea); 
     readPanel.add(readScrollPane); 
     readPanel.add(backButton3); 

     //Main Menu Panel 
     JPanel blank1 = new JPanel(); 
     JPanel mainMenuPanel = new JPanel(); 
     mainMenuPanel.setVisible(true); 
     //mainMenuPanel.setLayout(new GridLayout (3,9,5,5)); 
     mainMenuPanel.add(lbl1); 
     mainMenuPanel.add(filePath); 
     mainMenuPanel.add(browseBtn); 
     mainMenuPanel.add(searchBtn); 
     mainMenuPanel.add(writeBtn); 
     mainMenuPanel.add(readBtn); 
     mainMenuPanel.add(howTo); 
     mainMenuPanel.add(exitBtn); 

     //Program Frame 
     JFrame mainFrame = new JFrame ("File Control"); 
     mainFrame.setSize(300,235); 
     mainFrame.setLayout(new CardLayout()); 
     mainFrame.setLocationRelativeTo(null); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setVisible(true); 

     mainFrame.add(mainMenuPanel); 
     mainMenuPanel.add(searchPanel); 
     mainMenuPanel.add(writePanel); 
     mainMenuPanel.add(readPanel); 


    } 
} 

Примечание: то, что я пытался до сих пор: так как все 4 панели отображаются на раме (рама имеет компоновку карты). то, что я сделал, это попробовать и добавить слушателей действий к searchBtn и установить значение mainMenuPanel Visible false и searchPanel true, но ничего не произошло. Как я могу сделать его несколько оконным?

+2

Не делайте этого. Не бросайте много окна на пользователя, если вы не хотите, чтобы действительно раздражал пользователя. Вместо этого swap просматривает больше, чем окна, используя CardLayout. Используйте только два окна для необходимых диалогов, таких как диалоги для ввода и для проверки ввода. Пожалуйста, прочитайте и примите близко к сердцу: [Использование нескольких JFrames, Good/Bad Practice?] (Http: // stackoverflow.com/questions/9554636) –

+3

Кроме того, прежде чем беспокоиться о добавлении окон, вы захотите реорганизовать свою программу. В настоящее время у вас есть один божественный класс, наполненный статическим основным методом, программа, которая будет чрезвычайно ограничена в своих взаимодействиях с другими классами и в ее усовершенствованиях. Вместо этого создавайте объектно-ориентированные классы, которые имеют смысл, которые имеют низкую связь и высокую степень сцепления, которые могут быть независимо протестированы. –

+0

1) * "(у JFrame есть макет карты). Я сделал попытку и добавил actionListeners в searchBtn и установил trueMinduPanel Visible false и searchPanel true, но ничего не произошло." * Этот код не использует 'CardLayout' даже удаленно. См. [Этот ответ] (http://stackoverflow.com/a/5786005/418556) для рабочего примера или просмотрите [учебник] (https://docs.oracle.com/javase/tutorial/uiswing/layout /card.html). 2) 'mainFrame.setSize (300,235);' Это предположение о требуемом размере. Используйте 'pack()' для правильного размера. 3) 'JTextField filePath = new JTextField (20);' .. –

ответ

0

Вы можете добавить ActionListener в JButton, а затем ActionPerformed, который открывает другое окно GUI. Если вам нужна документация, вы можете найти его здесь ->event handler

-2

Из того, что я читаю, вы пытаетесь сделать, когда вы нажимаете кнопку, которую хотите запустить другую панель. Существуют различные способы сделать это, по моему опыту вы бы хотели использовать actionListener с помощью кнопки. Вот код, который я написал на основе простого калькулятора финансов, который вы можете использовать в качестве ссылки. Обратите внимание, что используется Combobox и вызывается метод getselecteditems(), чтобы получить каждый выбор из комбинированного поля на моей основной панели.

Затем я использую add() для добавления панели и removeall() и remove(), чтобы удалить ее.

private class financeBoxListener implements ActionListener 
      { 
       public void actionPerformed(ActionEvent e) 
       { 


        String selection = (String) financeBox.getSelectedItem(); 
        if(selection.equals("Present value")){ 
         //financeFinderPanel.removeAll(); 




         presentValuePanel(); 
         add(presentValuePanel, BorderLayout.NORTH); 


         financeFinderPanel.removeAll(); 
         remove(financeFinderPanel); 
         pack(); 

        } 



       else if(selection.equals("Simple interest")){ 



        simpleInterestPanel(); 
        add(simpleInterestPanel, BorderLayout.SOUTH); 

        financeFinderPanel.removeAll(); 
        remove(financeFinderPanel); 
        pack();      
        } 
       else if(selection.equals("Doubling time")){ 
        doublingTimePanel(); 
        add(doublingTimePanel, BorderLayout.NORTH); 

        financeFinderPanel.removeAll(); 
        remove(financeFinderPanel); 
        pack(); 
       } 
       else if(selection.equals("Compound interest")){ 

        compoundInterestPanel(); 
        add(compoundInterestPanel, BorderLayout.EAST); 
        financeFinderPanel.removeAll(); 
        remove(financeFinderPanel); 
        pack(); 
       } 

       else if(selection.equals("Future value")) 
       { 
        futureValuePanel(); 
        add(futureValuePanel, BorderLayout.WEST); 
        financeFinderPanel.removeAll(); 
        remove(financeFinderPanel); 
        pack(); 

       } 
       else if(selection.equals("Choose a formula")){ 

         setSize(200, 125); 
         financeFinderPanel(); 
         add(financeFinderPanel, BorderLayout.NORTH); 
         NONEMessage = new JLabel("PICK A SELECTION"); 


        } 







       } 
      } 

Существует много других способов сделать это, и это может быть не самый лучший способ в вашем случае. Есть что-то, называемое actionCommand и source, которые получают фактически вызванную команду, «вы можете использовать это с помощью кнопок».

как это ...

if(actionCommand.equals("Calc Simple Interest")){ 


         try{ 
         double principal = Double.parseDouble(principalText.getText()); 
         double yearlyRate = Double.parseDouble(yearlyRateText.getText()); 
         double termYears = Double.parseDouble(termYearsText.getText()); 

         double interestRate = financeFormula.simpleInterest(principal, yearlyRate, termYears); 
         //double interestRate = (principal * yearlyRate * termYears); 

         String msg = "Simple interest is: $" + dc.format(interestRate); 
         JOptionPane.showMessageDialog(null, msg); 




         simpleInterestPanel.removeAll(); 
         remove(simpleInterestPanel); 
         financeFinderPanel(); 
         add(financeFinderPanel, BorderLayout.NORTH); 
         pack(); 



} 

В этом примере имя кнопки я щелкнул является Calc Простой процент.