简体   繁体   中英

How to call Java class in ActionListener in another class

So, I'm trying to finish a program that creates a GUI that can translate assembly language to machine code. There are 7 classes needed for this program but the part I'm having trouble with is getting the program Assemble816 to run in the actionlistener in ASMEditor when the "Assemble" button is pressed. I keep getting a hundred different errors whenever I try different things. Pretty much stuck.

ASMEditor:

    public class ASMEditor extends JPanel {
        private JTextArea editArea;
        private JButton assembleButton;
        private JButton clearButton;
        private Assemble816 asm;
        private InstructionMemory iMem;


    public ASMEditor() {
        super( new BorderLayout() );
        setBackground( Color.white );
        Border blackLine = BorderFactory.createLineBorder(Color.black);
        setBorder(
            BorderFactory.createTitledBorder(blackLine, "Assembler"));

        editArea = new JTextArea();
        assembleButton = new JButton( "Assemble" );
        assembleButton.setBackground( getBackground() );
        assembleButton.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent evt ) {
                System.out.println( editArea.getText() );
                try{
                    Assemble816 asm = new Assemble816();
                    //this is all I have

                }
                catch(Exception ex)
                {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }

            }
        });
        clearButton = new JButton( "Clear" );
        clearButton.setBackground( getBackground() );
        clearButton.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent evt ) {
                editArea.setText("");
            }
        });


        JPanel buttons = new JPanel( new FlowLayout(FlowLayout.LEFT, 5, 5 )); 
        buttons.setBackground( Color.white );
        buttons.add( assembleButton );
        buttons.add( clearButton );
        add( buttons, BorderLayout.NORTH );

        Border blueLine = BorderFactory.createLineBorder(Color.blue);
        editArea.setBorder( blueLine );
        editArea.setBackground( new Color( 205, 255, 255) );
        editArea.setFont(new Font("monospaced", Font.PLAIN, 14 ));
        add( editArea, BorderLayout.CENTER );
    }

   }

and Assemble816:

    public class Assemble816 {
    private InstructionMemory im;

    private static String[] twoOperand = {
        "add", "adc", "sub", "xor", "and", "or", "lshift", "ashift"
    };

    private static int lookupTwoOp( String op ) {
        int opcode = 0;
        for( String o : twoOperand ) {
            if ( o.equals( op ) ) {
                return opcode;
            }
            opcode++;
        }
        return -1;
    }

    private static String[] oneOperand = {
        "inc", "dec", "asr", "lsl"
    };

    private static int lookupOneOp( String op ) {
        int opcode = 0;
        for( String o : oneOperand ) {
            if ( o.equals( op ) ) {
                return opcode;
            }
            opcode++;
        }
        return -1;
    }

    private static String[] skip = {
        "skipeq", "skipne", "skipge", "skiplt"
    };

    private static int lookupSkip( String op ) {
        int opcode = 0;
        for( String o : skip ) {
            if ( o.equals( op ) ) {
                return opcode;
            }
            opcode++;
        }
        return -1;
    }

    private static String[] wordConstant = {
        "ldc", "ldd", "std"
    };

    private static int lookupConstant( String op ) {
        int opcode = 0;
        for( String o : wordConstant ) {
            if ( o.equals( op ) ) {
                return opcode;
            }
            opcode++;
        }
        return -1;
    }

    public Assemble816( final InstructionMemory im ){
        this.im = im;
    }

    private static void parseTwoArgs( Scanner sc, String [] words  )
    throws SyntaxError
    {
        String rest = sc.nextLine();
        String[] ws = rest.split(",");
        if ( ws.length != 2 ) {
            throw new SyntaxError("Missing words");
        }
        words[0] = ws[0].trim();
        words[1] = ws[1].trim();
    }

    private static int parseRegister( String reg ) throws SyntaxError {
        if ( reg.equals("r0") ) {
            return 0;
        }
        else if ( reg.equals("r1") ) {
            return 1;
        }
        else if ( reg.equals("r2") ) {
            return 2;
        }
        else if ( reg.equals("r3") ) {
            return 3;
        }
        else {
            throw new SyntaxError("Not a register: " + reg );
        }
    }

    private static int parseInteger( String i ) throws SyntaxError {
        String ii = i;
        try {
            int sign = 1;
            if ( i.charAt(0) == '-' ) {
                i = i.substring(1);
                sign = -1;
            }
            int radix = 10;
            if ( i.startsWith("0x") ) {
                radix = 16;
                i = i.substring(2);
            }
            else if ( i.charAt(0) == '0' ) {
                radix = 8;
            }
            return Integer.parseInt(i, radix ) * sign;
        }
        catch( NumberFormatException ex ) {
            throw new SyntaxError("Not a number: " + ii );
        }
    }

    private static String stripComments( String line ) {
        int split = line.indexOf(';');
        if ( split == -1 ) {
            return line;
        }
        else {
            return line.substring(0, split );
        }
    }

    private void printIM( int address, int length ) {
        int dataPerLine = 0;
        for (int a = address; a < (address+length); a++ ) {
            if ( dataPerLine == 0 ) {
                System.out.printf("%04x", a&0xffff );
                dataPerLine = 16;
            }
            System.out.printf(" %02x", im.fetch(a) & 0xff );
            dataPerLine--;
            if ( dataPerLine == 0 ) {
                System.out.println();
            }
        }
        if ( dataPerLine != 0 ) {
            System.out.println();
        }
    }

    // added for project, not part of assignment
    public void assemble( File f ) throws IOException, SyntaxError {
        byte[] buf = new byte[(int) f.length()];
        FileInputStream fis = new FileInputStream( f );
        fis.read( buf );
        fis.close();
        assemble( new String( buf ) );
    }

    /**
     * Assemble the file, f.
     */
    public void assemble( String str) throws SyntaxError {
        int currentPC = 0;
        int opcode = 0;
        String[] args = new String[2];

        Scanner sc = new Scanner( str );
        while( sc.hasNextLine() ) {
            Scanner parse = new Scanner(stripComments(sc.nextLine()) );
            if ( !parse.hasNext() ) continue; // skip empty line
            String cmd = parse.next();
            if ( cmd.equals(".org") ) {
                if ( !parse.hasNext() ) {
                    throw new SyntaxError(".org excepting integer");
                }
                currentPC = parseInteger( parse.next() );
            }
            else if ( cmd.equals(".dump") ) {
                parseTwoArgs( parse, args );
                int start = parseInteger( args[0] );
                int length = parseInteger( args[1] );
                printIM( start, length );
            }
            else if ( (opcode=lookupConstant(cmd)) != -1 ) {
                parseTwoArgs( parse, args );
                int reg = parseRegister( args[0] );
                int k = parseInteger( args[1] );
                im.set( currentPC, (opcode<<2) | reg );
                currentPC++;
                im.set( currentPC, (k >> 8) & 0xff );
                currentPC++;
                im.set( currentPC, (k >> 0) & 0xff );
                currentPC++;
            }
            else if ( (opcode=lookupTwoOp(cmd)) != -1) {
                parseTwoArgs( parse, args );
                int dst = parseRegister( args[0] );
                int src = parseRegister( args[1] );
                im.set( currentPC, 0x80 | (opcode<<4) | dst << 2 | src );
                currentPC++;
            }
            else if ( cmd.equals( "br" ) ) {
                if ( !parse.hasNext() ) {
                    throw new SyntaxError("br excepting integer");
                }
                int branch = parseInteger( parse.next() );
                im.set( currentPC, 0x40 | (branch & 0x3f) );
                currentPC++;
            }
            else if ( (opcode=lookupOneOp(cmd)) != -1) {
                if ( !parse.hasNext() ) {
                    throw new SyntaxError(cmd + " excepting register");
                }
                int ds = parseRegister( parse.next() );
                im.set( currentPC, 0x20 | (opcode<<2) | ds );
                currentPC++;
            }
            else if ( (opcode=lookupSkip(cmd)) != -1) {
                if ( !parse.hasNext() ) {
                    throw new SyntaxError(cmd + " excepting register");
                }
                int ds = parseRegister( parse.next() );
                im.set( currentPC, 0x30 | (opcode<<2) | ds );
                currentPC++;
            }
            else if ( cmd.equals( "ld" ) ) {
                parseTwoArgs( parse, args );
                int index = parseRegister( args[0] );
                if ( index != 0 && index != 1 ) {
                    throw new SyntaxError("index register must be r0 or r1");
                }
                int ds = parseRegister( args[1] );
                im.set( currentPC, 0x10 | (0<<3) | (index<<2) | ds );
                currentPC++;
            }
            else if ( cmd.equals( "st" ) ) {
                parseTwoArgs( parse, args );
                int index = parseRegister( args[0] );
                if ( index != 0 && index != 1 ) {
                    throw new SyntaxError("index register must be r0 or r1");
                }
                int ds = parseRegister( args[1] );
                im.set( currentPC, 0x10 | (1<<3) | (index<<2) | ds );
                currentPC++;
            }
            else if ( cmd.equals( "jl" ) ) {
                if ( !parse.hasNext() ) {
                    throw new SyntaxError("jl excepting register");
                }
                int link = parseRegister( parse.next() );
                im.set( currentPC, 0x0c | link );
                currentPC++;
            }
            else {
                throw new SyntaxError("unknown instruction: " + cmd );
            }
        }
        sc.close();
    }

    /**
     * main - accepts the name of the file to assemble on the command line.
     */
    public static void main( String[] args ) {
        if ( args.length != 1 ) {
             System.out.println("usage: java Assemble816 file");
             return;
        }
        try {
            InstructionMemory im = new InstructionMemory();
            Assemble816 asm = new Assemble816( im );
            asm.assemble( new File( args[0] ) );
        }
        catch( IOException ex ) {
            System.out.println("io: " + ex.getMessage() );
        }
        catch( SyntaxError ex ) {
            System.out.println("syntax: " + ex.getMessage() );
        }
    }
}

Assemble816 has only one constructor, which requires a single parameter of InstructionMemory

assembleButton.addActionListener( new ActionListener() {
    public void actionPerformed( ActionEvent evt ) {
        System.out.println( editArea.getText() );
        try{
            InstructionMemory im = new InstructionMemory();
            Assemble816 asm = new Assemble816(im);
            asm.assemble(editArea.getText());
        } catch(Exception ex) {
            // I'd probably dump the stack trace here as well,
            // seen as you're not logging it anywhere
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }

    }
});

This is at 10,00 feet but isn't a try/catch a blocking statement? I think the best way would be to create a thread Runnable and run Assemble816 on a non-blocking thread. Otherwise, ASMEditor will hang while Assemble816 is running.

Also, just initializing the program won't trigger main automatically.. so the thread might be helpful for calling your assemble methods from within the super Editor class..

Threads

You made two instances of Assemble816, only one is needed.

In main() you made an instance with an argument.

You have to pass this instance as an argument to your class ASMEditor, modifying the constructor.

public class ASMEditor extends JPanel {
    private JTextArea editArea;
    private JButton assembleButton;
    private JButton clearButton;
    private Assemble816 asm;
    private InstructionMemory iMem;

    public ASMEditor( Assemble816 a ) {
       super( new BorderLayout() );
       asm = a;
       ...

No need to instantiates twice, so the event driven code becomes:

assembleButton.addActionListener( new ActionListener() {
   public void actionPerformed( ActionEvent evt ) {
      try{
         asm.assemble(editArea.getText());
         ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM