Я изучаю 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, но ничего не произошло. Как я могу сделать его несколько оконным?
Не делайте этого. Не бросайте много окна на пользователя, если вы не хотите, чтобы действительно раздражал пользователя. Вместо этого swap просматривает больше, чем окна, используя CardLayout. Используйте только два окна для необходимых диалогов, таких как диалоги для ввода и для проверки ввода. Пожалуйста, прочитайте и примите близко к сердцу: [Использование нескольких JFrames, Good/Bad Practice?] (Http: // stackoverflow.com/questions/9554636) –
Кроме того, прежде чем беспокоиться о добавлении окон, вы захотите реорганизовать свою программу. В настоящее время у вас есть один божественный класс, наполненный статическим основным методом, программа, которая будет чрезвычайно ограничена в своих взаимодействиях с другими классами и в ее усовершенствованиях. Вместо этого создавайте объектно-ориентированные классы, которые имеют смысл, которые имеют низкую связь и высокую степень сцепления, которые могут быть независимо протестированы. –
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);' .. –