簡體   English   中英

如何在另一個類中調用ActionListener中的Java類

[英]How to call Java class in ActionListener in another class

因此,我正在嘗試完成一個程序,該程序可以創建一個可以將匯編語言轉換為機器代碼的GUI。 這個程序需要7個類,但是我遇到問題的部分是當按下“Assemble”按鈕時,程序Assemble816在ASMEditor的actionlistener中運行。 每當我嘗試不同的東西時,我總會得到一百個不同的錯誤。 幾乎卡住了。

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 );
    }

   }

和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只有一個構造函數,它需要一個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());
        }

    }
});

這是10,00英尺,但不是嘗試/捕獲阻止聲明? 我認為最好的方法是創建一個線程Runnable並在非阻塞線程上運行Assemble816。 否則,在Assemble816運行時,ASMEditor將掛起。

另外,只是初始化程序不會自動觸發main ..因此該線程可能有助於從超級編輯器類中調用匯編方法。

主題

你創建了兩個Assemble816實例,只需要一個。

在main()中,您創建了一個帶參數的實例。

您必須將此實例作為參數傳遞給類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;
       ...

無需實例化兩次,因此事件驅動的代碼變為:

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