我正在寻找如何在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);
}
}
感谢所有帮助/方向。我知道我最近已经将这段代码用于其他问题,我只是想知道这一切!理想情况下,面板会在单击按钮时显示读取的平均值,并显示当焦点位于文本框架上并输入按下时输入的内容,但是我正在采取小步骤,就像我说的那样,我希望这个帖子能成为其他有类似问题但没有从sun文档或其他网站找到答案的人的一般教程。非常感谢提前。丹:)
答案 0 :(得分:7)
将JLabel添加到JPanel。
在JLabel上调用setText(String),您的文本将在JPanel中绘制。
答案 1 :(得分: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();
}
}
答案 2 :(得分:3)
1)JFrame没有paintComponent()方法,因此您发布的代码不会执行任何操作。您需要创建一个自定义JPanel并覆盖其paintComponent()方法来进行自定义绘制。
2)即使您执行上述操作,绘画仍然不会显示,因为默认情况下面板的大小为零。因此,您需要设置面板的首选大小以确保它可见。
3)你为什么这样做呢?您需要做的就是使用JLabel并设置JLabel的文本。
我发现很难相信你看过其他教程。 Custom Painting上的Swing教程有一个20行程序,显示了基础知识。
答案 3 :(得分:-1)
我认为你不应该继承JFrame。将JFrame的实例设为实例
Main类的变量并向其添加JPanel等。