Java JFrame 对话框问题
Java JFrame issue with dialog box
当我 运行 程序遇到 JFrame 缓冲区问题时,我不知道问题到底是什么。当我运行这个程序时,它会在缓冲区的左上角显示一些对话框部分。
这是我的程序的输出:
下面是代码
谢谢。
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class Main extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int[] x1 = new int[10];
int[] y1 = new int[10];
int i,n;
Polygon p=new Polygon();
n = Integer.parseInt(JOptionPane.showInputDialog("Enter no. of co-ordinates of polygon: "));
System.out.println(" no. of co-ordinates of polygon are :"+n);
for(i=0;i<n;i++)
{
x1[i] = Integer.parseInt(JOptionPane.showInputDialog("Enter x co-ordinates of polygon: "));
y1[i] = Integer.parseInt(JOptionPane.showInputDialog("Enter y co-ordinates of polygon: "));
}
for(i=0;i<n-1;i++)
{
g.drawLine(x1[i],y1[i],x1[i+1],y1[i+1]);
}
g.drawLine(x1[n-1],y1[n-1],x1[0],y1[0]);
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setTitle("Polygon");
frame.setSize(500,500);
Container contentPane = frame.getContentPane();
contentPane.add(new Main());
frame.setVisible(true);
}
}
从不 从绘画方法显示 JOptionPane。绘画方法仅用于绘画,不用于获取用户输入。
相反,您需要执行以下操作:
应从主要方法显示 JOptionPane 以收集 x/y 参数。
修改您的 Main() class 以获得类似 addPoint(int x, int y)
的方法。
然后,上述方法会将 x/y 值保存到 class 中的 ArrayList 对象中。我会在此列表中存储 Point 对象。
然后画法会遍历List,然后画每一行
只要 'something'(AWT EDT 线程)认为组件需要重新绘制,就会调用 paintComponent( ... ) 方法。该方法经常被调用,并且经常在您不希望它被调用的时刻被调用。因此,不要在该方法的主体中显示 JOptionPane。
- 所以最好像 camickr 说的那样只从 main 方法调用。
当我 运行 程序遇到 JFrame 缓冲区问题时,我不知道问题到底是什么。当我运行这个程序时,它会在缓冲区的左上角显示一些对话框部分。
这是我的程序的输出:
下面是代码
谢谢。
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class Main extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int[] x1 = new int[10];
int[] y1 = new int[10];
int i,n;
Polygon p=new Polygon();
n = Integer.parseInt(JOptionPane.showInputDialog("Enter no. of co-ordinates of polygon: "));
System.out.println(" no. of co-ordinates of polygon are :"+n);
for(i=0;i<n;i++)
{
x1[i] = Integer.parseInt(JOptionPane.showInputDialog("Enter x co-ordinates of polygon: "));
y1[i] = Integer.parseInt(JOptionPane.showInputDialog("Enter y co-ordinates of polygon: "));
}
for(i=0;i<n-1;i++)
{
g.drawLine(x1[i],y1[i],x1[i+1],y1[i+1]);
}
g.drawLine(x1[n-1],y1[n-1],x1[0],y1[0]);
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setTitle("Polygon");
frame.setSize(500,500);
Container contentPane = frame.getContentPane();
contentPane.add(new Main());
frame.setVisible(true);
}
}
从不 从绘画方法显示 JOptionPane。绘画方法仅用于绘画,不用于获取用户输入。
相反,您需要执行以下操作:
应从主要方法显示 JOptionPane 以收集 x/y 参数。
修改您的 Main() class 以获得类似
addPoint(int x, int y)
的方法。然后,上述方法会将 x/y 值保存到 class 中的 ArrayList 对象中。我会在此列表中存储 Point 对象。
然后画法会遍历List,然后画每一行
只要 'something'(AWT EDT 线程)认为组件需要重新绘制,就会调用 paintComponent( ... ) 方法。该方法经常被调用,并且经常在您不希望它被调用的时刻被调用。因此,不要在该方法的主体中显示 JOptionPane。
- 所以最好像 camickr 说的那样只从 main 方法调用。