【问题标题】:Recursive method call in MouseEvent flow issueMouseEvent 流问题中的递归方法调用
【发布时间】:2014-04-11 04:38:51
【问题描述】:

我希望这不是太具体,但我无法理解递归方法的逻辑流程。

目标:创建一个书籍类型的 gui,它将显示文本,保持换行,在 2 个 JTextArea 之间使用自动换行和页面换行。我不想通过滚动窗格来执行此操作,并且希望获得带有用于向左/向右翻转页面的按钮的书籍效果。

[伪]代码:将文本拉入并操作为(等宽拟合)行,将 X 行放入页面中。如果存在上一页/下一页,则启用左/右按钮。左侧显示 x 页,右侧显示 x+1 页。使用 (leftPageCursor) 来保持当前左页。

为了做到这一点,我的想法是有一个递归显示方法,它“显示/隐藏”左/右按钮,将文本放在 JTextAreas 上,并添加按钮侦听器代码。它在第一次单击右侧时起作用,但随后变得非常混乱并且 (leftPageCursor) 失控。我为任何人创建了以下 SSCCEE 以了解我的意思/逻辑。

我真的很感激任何帮助,我没有想法。我尝试了很多事情,最后一个(例如消费)没有成功。

SSCCEE:(请原谅篇幅过长 - 我希望它在运行的同时保持良好的评论)

public class ReadJIntLauncher extends JFrame {
    private static final long serialVersionUID = 1L;
    static JTextArea textAreaLeft, textAreaRight;
    static JButton btnPageLeft, btnPageRight;
    static int leftPageCursor = 0, readMessageId = 1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ReadJIntLauncher frame = new ReadJIntLauncher();
                    frame.setVisible(true);
                    HashMap<String, String> messages = new HashMap<String, String>();

                    messages.put("read_paragraph_1_0", "PAGE 1: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor");
                    messages.put("read_paragraph_1_1", "incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud");
                    messages.put("read_paragraph_1_2", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute");
                    messages.put("read_paragraph_1_3", "irure dolor in reprehenderit in voluptate velit esseees");

                    messages.put("read_paragraph_1_4", "PAGE 2: cillum dolore deserunt anim id est laborum anim id est laborum incididunt ut");
                    messages.put("read_paragraph_1_5", "labore incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis");
                    messages.put("read_paragraph_1_6", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute");
                    messages.put("read_paragraph_1_7", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.");

                    messages.put("read_paragraph_1_8", "PAGE 3: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor");
                    messages.put("read_paragraph_1_9", "incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud");
                    messages.put("read_paragraph_1_10", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute");
                    messages.put("read_paragraph_1_11", "irure dolor in reprehenderit in voluptate velit esseees");

                    messages.put("read_paragraph_1_12", "PAGE 4: cillum dolore deserunt anim id est laborum anim id est laborum incididunt ut");
                    messages.put("read_paragraph_1_13", "labore incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis");
                    messages.put("read_paragraph_1_14", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute");
                    messages.put("read_paragraph_1_15", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.");

                    messages.put("read_paragraph_1_16", "PAGE 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor");
                    messages.put("read_paragraph_1_17", "incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud");
                    messages.put("read_paragraph_1_18", "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.");

                    final HashMap<Integer, String> readLines = new HashMap<Integer, String>();
                    int lineCount = 0;
                    String entireText = "";

                    //grab all of the messages into entireText
                    for (int i = 0; i < Integer.MAX_VALUE; i++){
                        if (messages.containsKey("read_paragraph_" + readMessageId + "_" + i)){
                            String read = messages.get("read_paragraph_" + readMessageId + "_" + i);
                            entireText += read + " |";
                        } else {
                            break;
                        }
                    }

                    //split the entire text by spaces
                    String[] readSplitSpaces = entireText.split("\\s");

                    //put words into readLines
                    String singleLine = "";
                    for (String s : readSplitSpaces){
                        s = s + " ";
                        int wordLength = s.length();
                        if (s.contains("|")){
                            String[] sSplitStrings = s.split("\\|");
                            singleLine += sSplitStrings[0];
                            readLines.put(lineCount, singleLine);
                            lineCount++;
                            singleLine = sSplitStrings[1];
                        } else {
                            if ((singleLine.length() + wordLength) <= 26){
                                singleLine += s;
                            } else {
                                readLines.put(lineCount, singleLine);
                                lineCount++;
                                singleLine = s;
                            }
                        }
                    }

                    //print out readLines
                    for (int i = 0; i < Integer.MAX_VALUE; i++){
                        if (readLines.containsKey(i)){
                            System.out.println("[" + i + "] : " + readLines.get(i));
                        } else { break; }
                    }

                    //put readLines into readPages
                    final HashMap<Integer, String> readPages = new HashMap<Integer, String>();
                    int totalPageCount = lineCount / 15;
                    if (lineCount % 15 != 0){ //round up for partial pages
                        totalPageCount++;
                    }
                    for (int i = 0; i < totalPageCount; i++){
                        String tmpPage = "";
                        for (int k = 0; k < 15; k++){
                            if (readLines.containsKey(k + (i * 15))){
                                tmpPage += readLines.get(k + (i * 15)) + "\r\n";
                            }
                        }
                        readPages.put(i, tmpPage); //i is pageCount
                    }

                    //print out readPages
                    for (int i = 0; i < Integer.MAX_VALUE; i++){
                        if (readPages.containsKey(i)){
                            System.out.println("[" + i + "] : " + readPages.get(i));
                        } else { break; }
                    }   

                    displayReadPages(readPages);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public ReadJIntLauncher() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 600, 430);
        JPanel jint = new JPanel();

        jint.setBounds(100, 100, 534, 428);
        jint.setLayout(null);

        textAreaLeft = new JTextArea();
        textAreaLeft.setFont(new Font("Monospaced", Font.PLAIN, 14));
        textAreaLeft.setBounds(25, 37, 213, 297);
        jint.add(textAreaLeft);

        textAreaRight = new JTextArea();
        textAreaRight.setFont(new Font("Monospaced", Font.PLAIN, 14));
        textAreaRight.setBounds(261, 37, 213, 297);
        jint.add(textAreaRight);

        btnPageLeft = new JButton("left");
        btnPageLeft.setBounds(10, 345, 89, 23);
        jint.add(btnPageLeft);

        btnPageRight = new JButton("right");
        btnPageRight.setBounds(385, 345, 89, 23);
        jint.add(btnPageRight);

        getContentPane().add(jint);
    }

    public static void displayReadPages(final HashMap<Integer, String> readConvo){
        System.out.println("\nonLeftPage: " + leftPageCursor);
        //enable buttons if necessary
        if (leftPageCursor != 0){
            btnPageLeft.setEnabled(true);
        } else {
            btnPageLeft.setEnabled(false);
        }
        if (readConvo.containsKey(leftPageCursor + 2)){
            btnPageRight.setEnabled(true);
        } else {
            btnPageRight.setEnabled(false);
        }

        //set left and right page(possibly)
        textAreaLeft.setText(readConvo.get(leftPageCursor));            System.out.println("  left page: " + leftPageCursor);
        if (readConvo.containsKey(leftPageCursor + 1)) {
            textAreaRight.setText(readConvo.get(leftPageCursor + 1));   System.out.println("  right page: " + (leftPageCursor + 1));
        } else {
            textAreaRight.setText("");
        }

        btnPageLeft.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}

            public void mouseReleased(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1){
                    leftPageCursor -= 2;
                    displayReadPages(readConvo);
                }
            }
        });

        btnPageRight.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}

            public void mouseReleased(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1){
                    leftPageCursor += 2;
                    displayReadPages(readConvo);
                }
            }
        });
    }
}

【问题讨论】:

    标签: java swing recursion mouseevent jtextarea


    【解决方案1】:

    所以我想出了答案,并想把这个留在这里,以防有人偶然发现这个并想从我的错误中吸取教训。我将 .addMouseListener 代码移到构造函数中,它解决了问题。我猜它是在注册每次点击另一个侦听器,而不是“覆盖”可以这么说。

    我现在唯一遇到的问题是我仍然可以点击“禁用”按钮。

    这是解决方案...

    来源:CodeRanch

    ActionListener 是更高级别的语义事件,因此 当你的按钮被禁用时是正确的,也就是说,它不能 触发。 MouseListener 是一个较低的事件。它也可以作为 设计的。仅仅因为您禁用了该按钮并不能阻止 人们试图点击它,而 MouseListener 只是 乖乖地通知您发生了点击。事实是 disabled 是按钮状态的一部分,但不影响 MouseListener 捕获的事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多