我正在寻找有关如何在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);
}
}
任何和所有帮助/方向表示赞赏。我知道我最近在其他问题上使用过此代码,我只想知道全部!理想情况下,面板将显示单击按钮时读取的整数的平均值,并显示在焦点上并按Enter时输入到textfeild中的任何内容,但是我正在采取一些步骤,就像我说的那样,我希望此线程可以作为其他通用问题的教程,供其他有类似问题的人从Sun文档或其他网站上找不到答案。非常感谢。丹:)
创建一个内部类,在您的Main类中扩展JPanel:
class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(Integer.toString(avg), 75, 75);
}
}
然后,您需要在actionPerformed中调用computeAverage()之后在该面板上调用重画:
//event handling
public void actionPerformed(ActionEvent e) {
if (e.getSource() == avgBtn) {
computeAverage();
panel.repaint();
}
}
我想编写一个应用程序,让你用鼠标点击JFrame的左侧来画圆,所有的点都被“镜像”到右侧。我遇到的第一个问题是,当我尝试在框架中实现这个绘制机制时,没有出现圆。 当我使用容器时,它可以(在整个框架上)工作。add(new DrawCircle)但如果我想添加约束,它不会。 这是圆圈类:
问题内容: 我正在设计一个程序,该程序在JFrame中包含两个JPanel,一个用于保存图像,另一个用于保存GUI组件(Searchfields等)。我想知道如何将图像绘制到JFrame中的第一个JPanel? 这是我的构造函数的示例代码: } 我试图覆盖JPanel的paintComponent方法来绘制图像,但是当我尝试编写时,这在我的构造函数中导致了一个问题: 因为这将只允许我传递null的
我已经在JScrollPane中放置了一个JPanel对象,滚动工作就像预期的那样。通过重写paintComponent(),我尝试在JPanel对象中进行自定义绘制。然而,当JPanel对象放置在JScrollPane中时,JPanel不再正确地绘制(而是只显示其背景颜色)。 因为我的应用程序要求JPanel不断更新,所以构造了一个单独的线程,以在特定的时间间隔重新绘制JPanel。 以下代码摘
问题内容: 我如何告诉paint方法仅在JPanel上而不是在整个JFrame上绘制背景。我的JFrame大小大于JPanel。当我尝试为JPanel绘制网格背景时,网格似乎遍及整个JFrame,而不仅仅是JPanel。 以下是部分代码: 问题答案: camickr是正确的。所以: 您需要严格将工程图与不同组件分开。Swing已经在管理子组件,因此绝对不需要在Panel的Frame中实现图形(调用
问题内容: 我有一个包含3个JPanel的JFrame;选项,菜单,画布。在选项中,有许多表示形状的JButton。目的是单击形状(例如矩形)的JButton,然后在画布上单击任意位置,然后将在此处绘制形状。由于某种原因,形状并不总是被绘制,仅当我单击画布左上方区域中的某个位置时才绘制形状。此外,形状似乎会随我单击的位置而随机改变大小。 这是我的一些代码片段,这可能是一个小错误,但是我似乎找不到它