基本GUI问题

时间:2013-11-30 01:11:12

标签: java swing inheritance user-interface jframe

首先,我想说我已经搜索了这些论坛以及其他人以回答我的问题。我是Java的新手,也是一般的编程。经过几个小时的工作后,我想请一些帮助。

我正在尝试打开一个窗口(稍后会有一些图形),它有一个菜单栏。选项是3个下拉菜单,在选择时执行任务。文件菜单允许我保存,加载和退出程序。现在其余的只是打印到屏幕上让我知道有很多工作。现在,我想设置它,所以当我点击“创建卖家”选项时,它将打开一个包含3个字段的新对话框。我想在一个中输入一个字符串,在另外两个中输入两个双字节。然后我将它们存储为变量并将它们发送到另一个函数。我被困在这个部分已经太久了。请记住,虽然之前可能已经回答过,但我认为我还没有足够的能力使用Java来理解答案。如果不是太多问题,请尽量为我愚蠢。谢谢!

这是我正在上课的课程。如果需要,请随意提出更少或更多。

package seller;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFileChooser;
import javax.swing.JTextField;





import datastore.Meteorite;
import datastore.continents;
import datastore.customers;

import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;


public class BaseFrame extends JFrame implements ActionListener
{
    private static final long serialVersionUID = 1L;

    JFileChooser myChooser = new JFileChooser(".");

    JMenuItem menuItemSave;
    JMenuItem menuItemLoad;
    JMenuItem menuItemExit;
    JMenuItem menuItemCreateSeller;
    JMenuItem menuItemUpdateSeller;
    JMenuItem menuItemRemoveSeller;
    JMenuItem menuItemCreateMeteorite;
    JMenuItem menuItemUpdateMeteorite;
    JMenuItem menuItemRemoveMeteorite;
    JMenuItem menuItemCreateOneLine;
    continents worldMap = new continents();
    boolean[][] mapArray = null;

    int selection = 1;
    String shopName = null;
    Map myMap= new Map();
    Scanner myScanner = new Scanner(System.in);
    Menu myMenu = new Menu();   
    seller seller= new seller();
    Meteorites myMeteorite = new Meteorites();
    customers sellers= new customers(0,0,"test");
    customers buyers= new customers(0, 0, "test");
    ArrayList <Meteorite> myMeteorites =  new ArrayList<Meteorite>();
    ArrayList <customers> mySellers= new ArrayList<customers>();
    ArrayList <customers> myBuyers= new ArrayList<customers>();
    customers people= new customers(0,0,"test");


    public void makeGui()
    {
        this.setTitle("Phase 3");

        JMenuBar mb = new JMenuBar();
        this.setJMenuBar(mb);

        //Load and Save used from class example
        JMenu fileMenu = new JMenu("File");
        mb.add(fileMenu);

        menuItemSave = new JMenuItem("Save");
        menuItemSave.addActionListener(this);

        menuItemLoad = new JMenuItem("Load");
        menuItemLoad.addActionListener(this);

        menuItemExit = new JMenuItem("Exit");
        menuItemExit.addActionListener(this);

        fileMenu.add(menuItemSave);
        fileMenu.add(menuItemLoad);
        fileMenu.add(menuItemExit);


        //seller menu

        JMenu sellerMenu = new JMenu("Seller");
        mb.add(sellerMenu);

        menuItemCreateSeller = new JMenuItem("Create Seller");
        menuItemCreateSeller.addActionListener(this);

        menuItemUpdateSeller = new JMenuItem("Update Seller");
        menuItemUpdateSeller.addActionListener(this);

        menuItemRemoveSeller = new JMenuItem("Remove Seller");
        menuItemRemoveSeller.addActionListener(this);

        sellerMenu.add(menuItemCreateSeller);
        sellerMenu.add(menuItemUpdateSeller);
        sellerMenu.add(menuItemRemoveSeller);

        //handle meteorite menu

        JMenu handleMeteoriteMenu = new JMenu("Handle Meteorite");
        mb.add(handleMeteoriteMenu);

        menuItemCreateMeteorite = new JMenuItem("Create Meteorite");
        menuItemCreateMeteorite.addActionListener(this);

        menuItemUpdateMeteorite = new JMenuItem("Update Meteorite");
        menuItemUpdateMeteorite.addActionListener(this);

        menuItemRemoveMeteorite = new JMenuItem("Remove Meteorite");
        menuItemRemoveMeteorite.addActionListener(this);

        menuItemCreateOneLine = new JMenuItem("Create Meteorite(1 line)");
        menuItemCreateOneLine.addActionListener(this);

        handleMeteoriteMenu.add(menuItemCreateMeteorite);
        handleMeteoriteMenu.add(menuItemUpdateMeteorite);
        handleMeteoriteMenu.add(menuItemRemoveMeteorite);
        handleMeteoriteMenu.add(menuItemCreateOneLine);


        JPanel tPanel = new JPanel();
        this.add(tPanel);
        this.pack();
        this.setSize(new Dimension(640,480));
        this.setVisible(true);


    }
    String myName;
    double myLong;
    double myLat;
    @Override
    public void actionPerformed(ActionEvent e) 
    {

        Object source=null;
        source=e.getSource();   

        if (source == menuItemLoad)
        {

            mapArray = worldMap.createMap();

            myChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            int result = myChooser.showOpenDialog(this);

            //if user clicked Cancel button, return
            if (result == JFileChooser.CANCEL_OPTION)
                System.exit(1);

            File myFile = myChooser.getSelectedFile(); //get file

            //display error if invalid
            if ( ( myFile == null) || (myFile.getName().equals("")))
            {
                JOptionPane.showMessageDialog(this, "Invalid Name", "Invalid Name", JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }

            myMeteorites= myMeteorite.loadMeteorite(myMeteorites, myFile);
            sellers.loadSeller(mySellers);
            buyers.loadBuyer(myBuyers);

        }

        if (source == menuItemSave)
        {
            mapArray = worldMap.createMap();

            myChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            int result = myChooser.showOpenDialog(this);

            //if user clicked Cancel button, return
            if (result == JFileChooser.CANCEL_OPTION)
                System.exit(1);

            File myFile = myChooser.getSelectedFile(); //get file

            //display error if invalid
            if ( ( myFile == null) || (myFile.getName().equals("")))
            {
                JOptionPane.showMessageDialog(this, "Invalid Name", "Invalid Name", JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }

            myMeteorites= myMeteorite.saveMeteorite(myMeteorites, myFile);
            sellers.saveSeller(mySellers);
            buyers.saveBuyer(myBuyers);

        }

        if (source == menuItemExit)
        {
            System.exit(1); //exit system
        }

        if (source == menuItemCreateSeller)
        {

            JFrame myFrame = new JFrame("Create a Seller");
            JPanel myPanel = new JPanel();
            JLabel myLabel1 = new JLabel();
            JLabel myLabel2 = new JLabel();
            JLabel myLabel3 = new JLabel();
            final JTextField myText1 = new JTextField(30);
            final JTextField myText2 = new JTextField(30);
            final JTextField myText3 = new JTextField(30);
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            myLabel1.setText("Enter Name");
            myLabel2.setText("Enter Longitude");
            myLabel3.setText("Enter Latitude");

            myPanel.add(myLabel1);
            myPanel.add(myText1);       
            myPanel.add(myLabel2);
            myPanel.add(myText2);   
            myPanel.add(myLabel3);
            myPanel.add(myText3);

            myFrame.add(myPanel);
            myFrame.setSize(350,200);
            myFrame.setVisible(true);

            myText1.addActionListener(new ActionListener()
            {

                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    // TODO Auto-generated method stub
                    myName = myText1.getText();
                }

            });

            myName = myText1.getText();
            //myLong = Double.parseDouble(myText2.getText());
            //myLat = Double.parseDouble(myText3.getText());


            System.out.println(myName);
            //mySellers=people.createCust(mySellers, myLong, myLat, myName);
            //mySellers=people.saveSeller(mySellers);       
        }

        if (source == menuItemRemoveSeller)
        {
            System.out.println("remove seller");
        }

        if (source == menuItemUpdateSeller)
        {
            System.out.println("update seller");
        }

        if (source == menuItemCreateMeteorite)
        {
            System.out.println("create meteorite");
        }

        if (source == menuItemUpdateMeteorite)
        {
            System.out.println("updateMeteorite");
        }
        if (source == menuItemRemoveMeteorite)
        {
            System.out.println("remove meteorite");
        }

        if (source == menuItemCreateOneLine)
        {
            System.out.println("create one line");
        }

    }
}

2 个答案:

答案 0 :(得分:1)

请参阅此示例,了解我所说的内容。虽然我建议不要使用多个帧,但这对于你想要做的事情是有效的。正如@MadProgrammer建议的那样,请研究创建JDialog s

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

public class BaseFrame extends JFrame {

    private String name;
    private double value1;
    private double value2;

    private final JMenuBar jMenuBar = new JMenuBar();
    private final JMenu jmOpen = new JMenu("Open");
    JMenuItem menuItemCreateSeller = new JMenuItem("Create Seller");
    InnerFrame innerFrame = new InnerFrame();

    public BaseFrame() {

        innerFrame.setResizable(false);
        jmOpen.add(menuItemCreateSeller);
        jMenuBar.add(jmOpen);

        setJMenuBar(jMenuBar);

        menuItemCreateSeller.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                innerFrame.setVisible(true);
            }
        });

        setSize(300, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                Frame frame = new BaseFrame();
            }
        });
    }

    private class InnerFrame extends JFrame {

        JPanel myPanel = new JPanel();
        JLabel myLabel1 = new JLabel("Enter Name");
        JLabel myLabel2 = new JLabel("Enter Longitude");
        JLabel myLabel3 = new JLabel("Enter Latitude");
        JLabel jlblStatus = new JLabel(" ");
        JTextField myText1 = new JTextField(10);
        JTextField myText2 = new JTextField(10);
        JTextField myText3 = new JTextField(10);

        JButton jbtPrint = new JButton("Print");

        public InnerFrame() {

            myPanel.add(myLabel1);
            myPanel.add(myText1);
            myPanel.add(myLabel2);
            myPanel.add(myText2);
            myPanel.add(myLabel3);
            myPanel.add(myText3);

            JPanel p1 = new JPanel(new GridLayout(1,2));
            p1.add(jlblStatus);
            p1.add(jbtPrint);
            jlblStatus.setHorizontalAlignment(SwingConstants.LEFT);
            jlblStatus.setForeground(Color.RED);

            jbtPrint.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        name = myText1.getText();
                        value1 = Double.parseDouble(myText2.getText());
                        value2 = Double.parseDouble(myText3.getText());
                        System.out.println(name);
                        double total = value1 + value2;
                        System.out.println(total);

                        setVisible(false);
                    } catch (NumberFormatException ex) {
                        jlblStatus.setText("Invalid Input");
                    }
                }
            });

            add(myPanel, BorderLayout.CENTER);
            add(p1, BorderLayout.SOUTH);
            setSize(180, 220);
            setLocationRelativeTo(null);
            setVisible(false);

        }
    }
}

答案 1 :(得分:1)

您在评论中得到了很好的建议,而且已发布的另一个答案看起来合情合理。我要提出你可能需要或不需要的解释;如果你确实需要它,那就很难解释你需要它,因为它是一个你可能还没有被同化的概念。

UI编程是&#34;事件驱动&#34 ;;这意味着,不是像对非交互式程序那样控制代码,而是将控件传递给另一个系统或系统的一部分,当某些事件发生时,其他部分会调用您的代码。其他部分&#39;在这种情况下是Swing运行时。因此,您的代码就是设置框架,面板,布局,文本字段,下拉菜单等,并将侦听器设置为可能导致事件的事件,并等待事件发生。

如果您的困惑源于对此的不了解,那么您的问题的答案可能是对话框上的按钮的监听器将从下拉和/或文本字段中读取值 - - 可能是用户选择和/或输入了他/她应该的值,然后单击按钮。因此,单击(按下)按钮(或输入键)时触发的动作例程将获取这些值,并将它们放入变量(或将它们写入数据库或使用它们实例化另一个对象或无论它应该做什么。

这个例程也可以进行验证 - 例如,如果其中一个文本字段包含一个必需的值而用户没有填写它,那么这个监听器例程可以检测到它,而不是允许程序继续,可以弹出一个消息对话框,让用户告诉他/她出了什么问题。

同样,我不知道这是你问题的任何一部分,但我认为可能是。这是一个缺乏经验的UI程序员有时会遇到麻烦的概念,而且它是如此基础的UI编程,很多教程只是假设你已经知道它。