簡體   English   中英

如何用字符串不斷更新 canvas?

[英]How to constantly update a canvas with a string?

我正在嘗試制作一個簡單的游戲來顯示用戶在鍵入時鍵入的單詞。 但是,我不確定如何調用或更新write()方法以便在用戶鍵入字符串時顯示字符串currentWord ,每次添加或刪除新字符時。

我不確定這是否是 go 的正確方式:

import java.awt.*;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JButton;

import java.util.*;

public class CopyOfGamePanel extends Canvas {

    public static String currentWord = "BEGIN";

    public static void main(String[] args) {
        String[] acceptable = {
            "pressed A",
            "pressed B",
            "pressed C",
            "pressed D",
            "pressed E",
            "pressed F",
            "pressed G",
            "pressed H",
            "pressed I",
            "pressed J",
            "pressed K",
            "pressed L",
            "pressed M",
            "pressed N",
            "pressed O",
            "pressed P",
            "pressed Q",
            "pressed R",
            "pressed S",
            "pressed T",
            "pressed U",
            "pressed V",
            "pressed W",
            "pressed X",
            "pressed Y",
            "pressed Z"
        };

        JFrame frame = new JFrame();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setFocusable(true);

        Canvas canvas = new CopyOfGamePanel();
        canvas.setSize(500, 700);
        canvas.setBackground(Color.white);
        frame.getContentPane().add(canvas);

        frame.pack();
        frame.setVisible(true);

        java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new java.awt.KeyEventDispatcher() {
            public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
                String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
                if (key.equals("pressed BACK_SPACE"))
                    deleteLetter();
                if (Arrays.asList(acceptable).contains(key)) {
                    addLetter(key);
                    frame.pack();
                }
                //System.out.println(key);
                return true;
            }
        });
    }
    public void paint(Graphics g) {
        backgroundGUI(g);
        write(g);
    }

    public void backgroundGUI(Graphics g) {

        g.drawLine(0, 300, 500, 300);

    }
    public void write(Graphics g) {

        g.drawString(currentWord, 50, 290);

    }


    public static void addLetter(String key) {
        char letter = key.charAt(8);

        currentWord = currentWord + letter;
        System.out.println("Current Word: " + currentWord);

    }
    public static void deleteLetter() {
        System.out.println("Delete a letter");
        if (currentWord.length() > 0) {
            currentWord = currentWord.substring(0, currentWord.length() - 1);
            System.out.println("Current Word: " + currentWord);
        } else {
            System.out.println("There are no more letters to delete");
        }
    }
}

您正在尋找Canvas#repaint來觸發新的繪制周期。

首先,我將鍵盤輸入處理隔離到CopyOfGamePanel class 本身,以便它可以自動進行更新。 如果您需要通過其他一些工作流程向 go 輸入(出於某些奇怪的原因),則需要通知CopyOfGamePanel (可能通過某種觀察者/偵聽器回調)它需要的信息並重新繪制自身。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.util.Arrays;
import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new CopyOfGamePanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CopyOfGamePanel extends Canvas {

        public static String currentWord = "BEGIN";
        private String[] acceptable = {"pressed A", "pressed B", "pressed C", "pressed D", "pressed E", "pressed F", "pressed G",
            "pressed H", "pressed I", "pressed J", "pressed K", "pressed L", "pressed M", "pressed N", "pressed O",
            "pressed P", "pressed Q", "pressed R", "pressed S", "pressed T", "pressed U", "pressed V", "pressed W",
            "pressed X", "pressed Y", "pressed Z"};

        public CopyOfGamePanel() {
            setBackground(Color.WHITE);
            java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new java.awt.KeyEventDispatcher() {
                public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
                    String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
                    if (key.equals("pressed BACK_SPACE")) {
                        deleteLetter();
                    }
                    if (Arrays.asList(acceptable).contains(key)) {
                        addLetter(key);
                    }
                    return true;
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 700);
        }

        public void paint(Graphics g) {
            backgroundGUI(g);
            write(g);
        }

        public void backgroundGUI(Graphics g) {
            g.drawLine(0, 300, 500, 300);
        }

        public void write(Graphics g) {
            g.drawString(currentWord, 50, 290);
        }

        public void addLetter(String key) {
            char letter = key.charAt(8);

            currentWord = currentWord + letter;
            System.out.println("Current Word: " + currentWord);
            repaint();
        }

        public void deleteLetter() {
            System.out.println("Delete a letter");
            if (currentWord.length() > 0) {
                currentWord = currentWord.substring(0, currentWord.length() - 1);
                System.out.println("Current Word: " + currentWord);
            } else {
                System.out.println("There are no more letters to delete");
            }
            repaint();
        }
    }

}

為什么會彈出問題:

  • 您需要為此使用Canvas ,這是一個相當“低級”的組件,因此除非您實際使用BufferStrategy ,否則它似乎是一種浪費(並且可能是問題的根源)
  • 您沒有使用JTextField (或者如果您熱衷於 AWT,則使用TextField )來管理用戶輸入
  • 你沒有使用KeyListener ,沒有冒犯,但像這樣使用KeyboardFocusManager很像試圖用 C4 敲花生,當然,它可能會起作用,但也可能會造成混亂。

我想你可能想看看:

如果你剛開始接觸這類東西,看看 JavaFX 可能會更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM