微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符串不会使用 drawString()

如何解决字符串不会使用 drawString()

我正在编写一个简单的琐事游戏,但遇到了问题字符串不显示的问题 在我的框架中,我使用边框布局,底部(南部)带有“新游戏”和“结束游戏”,中间是我的琐事面板。 琐事面板由 2 行 1 列的网格布局组成,下半部分和上半部分有 4 个答案我使用了另一个带有边框布局的面板,问题字符串在中心,分数在东。 它应该是这样的:

enter image description here

但是,除了问题字符串之外,所有组件都显示出来。 我的paintComponent是:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setFont(font);
    g.drawString(tf,0);
}

其中 tf 是我的字符串,我的琐事面板代码是:

public TriviaPanel(){
    score = 0;
    scoreString = new JTextField();
    scoreString.setFont(font);
    questionPanel = new JPanel();
    questionPanel.setLayout(new BorderLayout());
    questionPanel.add(scoreString,BorderLayout.EAST);
    this.setLayout(new GridLayout(2,1));
    pool = null;
    try {
        pool = new Pool();
    } catch (FileNotFoundException e) {
        e.printstacktrace();
    }
    question = pool.getQuestion();
    String[] answers = question.shuffle();
    tf = question.getQuestion();
    this.add(questionPanel);
    answersPanel = new JPanel();
    answersPanel.setLayout(new GridLayout(2,2));
    buttons = new JButton[NUM_OF_ANSWERS];
    for (int i = 0; i < NUM_OF_ANSWERS; i++) {
        buttons[i] = new JButton(answers[i]);
        answersPanel.add(buttons[i]);
        buttons[i].addActionListener(lis);

    }
    this.add(answersPanel);
scoreString.setText("score: "+score+"/"+pool.getIterator()*CORRECT);
}

pool 用于存放我的问题池。 当我调试代码时,我看到 tf 字符串被更新为问题字符串,但它不会显示。 是因为坐标吗? 任何见解将不胜感激。

[编辑] 虽然未完成但完整代码如下:

import java.util.Arrays;
import java.util.Collections;

public class Question {
    private final int NUM_OF_ANSWERS = 4;
    private String question;
    private String[] answers = new String[NUM_OF_ANSWERS];
    private final int CORRECT_ANSWER = 0;

    public Question(String qu,String an,String dm1,String dm2,String 
dm3){
        question = qu;
        answers[0] = an;
        answers[1] = dm1;
        answers[2] = dm2;
        answers[3] = dm3;
    }

    public String getCorrectAnswer() {
        return answers[CORRECT_ANSWER];
    }

    public String getQuestion(){
        return question;
    }

    public String[] getAnswers(){
        return answers;
    }
    public String toString(){
        String str = question;
        for (int i = 0; i<4; i++)
            str+=" "+answers[i];
        str+="\n";
        return str;
    }
    public String[] shuffle(){
        String[] shuffled = new String[NUM_OF_ANSWERS];
        for (int i=0;i<NUM_OF_ANSWERS;i++)
            shuffled[i]=answers[i];
        Collections.shuffle(Arrays.asList(shuffled));
        return shuffled;
    }
}


import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;

public class Pool {

    private ArrayList<Question> questions = new ArrayList<>();
    private Scanner input = new Scanner(new File("src/trivia.txt"));
    private static int iterator = 0;

    public Pool() throws FileNotFoundException {
        while (input.hasNext()){
            String q = input.nextLine();
            String a = input.nextLine();
            String d1 = input.nextLine();
            String d2 = input.nextLine();
            String d3 = input.nextLine();
            Question question = new Question(q,a,d1,d2,d3);
            questions.add(question);
        }
        Collections.shuffle(questions);
        //System.out.println(questions);
    }

    public Question getQuestion(){
        Question q = questions.get(iterator);
        iterator++;
        return q;
    }

    public int getSize(){
        return questions.size();
    }

    public static int getIterator() {
        return iterator;
    }
}

import javax.swing.*;
import java.awt.*;

public class GameFrame extends JFrame {
private JButton restart,finish;
private JPanel buttons;
    public GameFrame(){
        super("Trivia");
        TriviaPanel tp = new TriviaPanel();
        this.setLayout(new BorderLayout());
        this.add(tp,BorderLayout.CENTER);
        restart = new JButton("New game");
        finish = new JButton("End game");
        buttons = new JPanel();
        buttons.add(restart);
        buttons.add(finish);
        this.add(buttons,BorderLayout.soUTH);
        this.setSize(1000,600);
        this.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        GameFrame gf = new GameFrame();
    }

}

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.util.concurrent.TimeUnit;

public class TriviaPanel extends JPanel {
    private TimerListener tl = new TimerListener();
    private Timer timer = new Timer(10000,tl);
    private static int score;
    private JTextField scoreString;
    private final int CORRECT = 10,INCORRECT = 5;
    private JButton[] buttons;
    private Pool pool;
    private Question question;
    private JButton pressed;
    private final int NUM_OF_ANSWERS = 4;
    private Listener lis = new Listener();
    //private JPanel questionPanel;
    private JPanel answersPanel;
    private String tf;
    private Font font = new Font("Serif",Font.BOLD,24);
    private JTextField tf2 = new JTextField();
    private QuestionPanel questionPanel;
public TriviaPanel(){
        score = 0;
        scoreString = new JTextField();
        scoreString.setFont(font);
        questionPanel = new QuestionPanel();
        //questionPanel.setLayout(new BorderLayout());
        //questionPanel.add(scoreString,BorderLayout.EAST);
        this.setLayout(new GridLayout(2,1));
        pool = null;
        try {
            pool = new Pool();
        } catch (FileNotFoundException e) {
            e.printstacktrace();
        }
        question = pool.getQuestion();
        String[] answers = question.shuffle();
        tf = question.getQuestion();
        //tf2.setText(question.getQuestion());
        //questionPanel.add(tf2,BorderLayout.CENTER);
        this.add(questionPanel);
        answersPanel = new JPanel();
        answersPanel.setLayout(new GridLayout(2,2));
        buttons = new JButton[NUM_OF_ANSWERS];
        for (int i = 0; i < NUM_OF_ANSWERS; i++) {
            buttons[i] = new JButton(answers[i]);
            answersPanel.add(buttons[i]);
            buttons[i].addActionListener(lis);

        }
        this.add(answersPanel);
    timer.start();
    scoreString.setText("score: "+score+"/"+pool.getIterator()*CORRECT);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        questionPanel.repaint();
    }

    private void next(){
        Question q = pool.getQuestion();
        question=q;
        tf = q.getQuestion();
        String[] answers = q.shuffle();
        for (int i = 0; i < NUM_OF_ANSWERS; i++)
            buttons[i].setText(answers[i]);

    }

    private void gameOver(){
        JOptionPane.showConfirmDialog(null,"score: "+score,"Select an Option...",JOptionPane.YES_NO_CANCEL_OPTION);
    }

    private void check(String guess) {
        timer.stop();
        String answer = question.getCorrectAnswer();
        if (guess.equals(answer)) {
            score += CORRECT;
            tf = "Correct!!!";
        } else {
            score -= INCORRECT;
            tf = "Wrong answer";
        }
        scoreString.setText("score: "+score+"/"+pool.getIterator()*CORRECT);
        repaint();
        try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
    }

    private class QuestionPanel extends JPanel{

    public QuestionPanel(){
            this.setLayout(new BorderLayout());
            this.add(scoreString,BorderLayout.EAST);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setFont(font);
            g.drawString(tf,200);
        }
    }

    private class Listener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            pressed = (JButton) e.getSource();
            String guess = pressed.getText();
            check(guess);
            if (pool.getIterator() < pool.getSize()) {
                timer.restart();
                next();
            }
            else
                gameOver();
        }

    }

    private class TimerListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            timer.stop();
            score-=INCORRECT;
            scoreString.setText("score: "+score+"/"+pool.getIterator()*CORRECT);
            repaint();
            timer.restart();
            next();
        }
    }
}

解决方法

从摆脱开始

PascalCase

说真的,这很危险,可能会让你陷入无限循环,这会消耗你的 CPU 周期

接下来,我修改了您的 address_form.instance.student = student,因此文本实际上呈现在概率范围内的某处......

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    questionPanel.repaint();
}

但是说真的,你为什么不直接使用 QuestionPanel

现在,只要 private class QuestionPanel extends JPanel { public QuestionPanel() { this.setLayout(new BorderLayout()); this.add(scoreString,BorderLayout.EAST); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setFont(font); FontMetrics fm = g.getFontMetrics(); int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent(); g.drawString(tf,10,y); } } 发生变化,您都需要调用 JLabeltf 方法。

所以,这在 QuestionPanelrepaint 方法中。

最后(就目前而言),你永远不应该做...

next

在事件调度线程的上下文中。这是停止处理重绘,所以,一整秒,什么都不会改变。

如果您想暂时停止用户,请禁用按钮和/或其他控件并使用另一个 Swing check(String)(为简单起见)

这在这个自包含、可编译和可运行的示例中得到了演示...

try {
    TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
    e.printStackTrace();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。