6

我正在寻找有关如何在 JPanel 中绘制文本的最基本描述。我知道那里有十亿个教程,但没有一个是点击我的,我有一些具体的问题可以帮助其他困惑的人。作为一个设置(一个测试应用程序),我有一个类,它有一个 JLabel、一个 JTextField、一个 JButton 和一个 JPanel。应用程序从外部文件中读取整数,并在按下 JButton 时在面板中显示它们的平均值。我已经整理好所有底层程序(即按钮响应并将平均值打印到命令行),但我似乎无法整理出如何将平均值打印到面板。我想我最大的问题是如何将paint() 或paintComponet() 方法与其余代码结合起来。它应该是它自己的类吗?JPanel 应该是它吗?自己的课?这似乎是大多数教程告诉我的,我只是不确定第一步到底是什么。代码如下所示:

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

public class Main extends JFrame implements ActionListener {
  private int[] intArray = new int[10000];
  private int numOfInts = 0;
  private int avg = 0;

  protected JButton avgBtn;
  protected JTextField indexEntry;
  protected JLabel instructions;
  protected JPanel resultsPanel;

  public Main(){

    //create main frame
    this.setTitle("Section V, question 2");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(350, 250);
    this.setLayout(new GridLayout(4, 1));

    //create instruction label and add to frame
    instructions = new JLabel("Follow the instructions on the exam to use this program");
    this.add(instructions);

    //create textfield for index entry and add to frame
    indexEntry = new JTextField();
    this.add(indexEntry);

    //create button for average and add to frame
    avgBtn = new JButton("Click for Average");
    this.add(avgBtn);
    avgBtn.addActionListener(this);

    //create panel to display results and add to frame
    resultsPanel = new JPanel();
    resultsPanel.setBackground(Color.BLUE);
    this.add(resultsPanel);

    //read in from file
    readFromFile();

    //compute average
    computeAverage();
  }

  private void readFromFile() {
    try {
            // Open the file
            FileInputStream fstream = new FileInputStream("numbers.dat");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

            //create placeholder for read in ints
            String strLine;

            //Read File Line By Line
            int i = 0;
            while ((strLine = br.readLine()) != null) {
              //place ints in array and increament the count of ints
              System.out.println (strLine);
              intArray[i] = Integer.parseInt(strLine);
              numOfInts++;
              i++;
            }
            //Close the input stream
            in.close();
            System.out.println ("numOfInts = " + numOfInts);
    }
    catch (Exception e) {
            //Catch exception if any
            System.err.println("Error: " + e.getMessage());
    }
  }

  //compute averaage
  private void computeAverage() {
    int sum = 0;
    for (int i = 0; i < numOfInts; i++)
    sum += intArray[i];
    avg = sum/numOfInts;
    System.out.println("avg = " + avg);
  }

//event handling
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == avgBtn) {
            computeAverage();
    }
}

//"main" function
public static void main(String[] args) {
    Main m = new Main();
    m.setVisible(true);
}

//paint
public void paintComponent(Graphics g){
  g.drawString(avg, 75, 75);
}
}

任何和所有的帮助/方向表示赞赏。我知道我最近将此代码用于其他问题,我只想知道这一切!理想情况下,面板会在单击按钮时显示以整数为单位读取的平均值,并在焦点位于其上并按下输入时显示输入到 textfeild 中的任何内容,但我正在采取婴儿步骤,就像我说的那样,我希望此线程成为其他有类似问题但无法从 sun 文档或其他站点找到答案的人的通用教程。提前非常感谢。丹:)

4

4 回答 4

7

将 JLabel 添加到 JPanel。

在 JLabel 上调用 setText(String),您的文本将在 JPanel 中绘制。

于 2009-12-02T04:36:14.783 回答
6

在 Main 类中创建一个扩展 JPanel 的内部类:

class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(Integer.toString(avg), 75, 75);
    }

}

然后您需要在 actionPerformed 中调用 computeAverage() 后在该面板上调用 repaint:

//event handling
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == avgBtn) {
        computeAverage();
        panel.repaint();
    }
}
于 2009-12-02T04:37:20.460 回答
4

1) JFrame 没有paintComponent() 方法,因此您发布的代码不会做任何事情。您需要创建一个自定义 JPanel 并覆盖其 paintComponent() 方法来进行自定义绘画。

2)即使您执行上述操作,绘画仍然不会显示,因为默认情况下面板的大小为零。因此,您需要设置面板​​的首选大小以确保它可见。

3)你为什么要这样做。您需要做的就是使用 JLabel 并设置 JLabel 的文本。

我很难相信你看过其他教程。自定义绘画的 Swing 教程有一个 20 行的程序,显示了基础知识。

于 2009-12-02T04:37:22.207 回答
-1

我认为你不应该继承 JFrame。将 JFrame 的实例设为
Main 类的实例变量,并将 JPanel 等添加到其中。

于 2009-12-02T04:39:56.447 回答