简体   繁体   English

如何在另一个类中调用ActionListener中的Java类

[英]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. 因此,我正在尝试完成一个程序,该程序可以创建一个可以将汇编语言转换为机器代码的GUI。 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. 这个程序需要7个类,但是我遇到问题的部分是当按下“Assemble”按钮时,程序Assemble816在ASMEditor的actionlistener中运行。 I keep getting a hundred different errors whenever I try different things. 每当我尝试不同的东西时,我总会得到一百个不同的错误。 Pretty much stuck. 几乎卡住了。

ASMEditor: 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: 和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 Assemble816只有一个构造函数,它需要一个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? 这是10,00英尺,但不是尝试/捕获阻止声明? I think the best way would be to create a thread Runnable and run Assemble816 on a non-blocking thread. 我认为最好的方法是创建一个线程Runnable并在非阻塞线程上运行Assemble816。 Otherwise, ASMEditor will hang while Assemble816 is running. 否则,在Assemble816运行时,ASMEditor将挂起。

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.. 另外,只是初始化程序不会自动触发main ..因此该线程可能有助于从超级编辑器类中调用汇编方法。

Threads 主题

You made two instances of Assemble816, only one is needed. 你创建了两个Assemble816实例,只需要一个。

In main() you made an instance with an argument. 在main()中,您创建了一个带参数的实例。

You have to pass this instance as an argument to your class ASMEditor, modifying the constructor. 您必须将此实例作为参数传递给类ASMEditor,修改构造函数。

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());
         ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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