我应该在哪里开始绘制? (Java中,GUI)
-
23-08-2019 - |
题
我得到GenerateButton类的结束点,但现在,我得到了我的公共双[] []矩阵中,我从哪里开始画他们???所有的点
我Main.java:
import java.awt.*;
import javax.swing.*;
public class Main {
public static Display display = new Display();
public static void main(String[] args) {
display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
display.setVisible(true);
}
}
我Display.java:
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.util.Vector;
import javax.swing.*;
public class Display extends JFrame {
final int FRAME_WIDTH = 910;
final int FRAME_HEIGHT = 660;
final int X_OFFSET = 40;
final int Y_OFFSET = 40;
final int GRAPH_OFFSETX = 15;
final int GRAPH_OFFSETY = 40;
final int GRAPH_WIDTH = 500;
final int GRAPH_HEIGHT = 500;
final int GRAPH_INTERVAL = 20;
JButton submit;
JTextField numPoint;
JPanel bpanel;
JPanel points;
Vector<JTextField> pointsA = new Vector<JTextField>();
int maxPoints;
public double[][] matrix;
public Display() {
init();
}
public void init() {
setBackground(Color.WHITE);
setLocation(X_OFFSET, Y_OFFSET);
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setTitle("Geometric Transformations");
getContentPane().setLayout(null);
setDefaultLookAndFeelDecorated(true);
numPoint = new JTextField();
numPoint.setText("# Points?");
numPoint.setBounds(530,200,120+20,25);
SubmitButton submit = new SubmitButton("Submit");
submit.setBounds(530+150, 200, 100, 25);
GenerateButton submitC = new GenerateButton("Generate");
submitC.setBounds(530-5, 200+130, 100, 25);
points = new JPanel(new GridLayout(2,2));
points.setBounds(530, 200+40,100+270,80);
this.add(numPoint);
this.add(submit);
this.add(submitC);
this.add(points, BorderLayout.LINE_START);
repaint();
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.WHITE);
g.fillRect(100, 100, 20, 30);
g.setColor(Color.BLACK);
genGraph(g, GRAPH_OFFSETX, GRAPH_OFFSETY,
GRAPH_WIDTH, GRAPH_HEIGHT, GRAPH_INTERVAL);
}
public void genGraph (Graphics g, int x, int y,
int width, int height, int interval) {
// draw background
int border = 5;
g.setColor(Color.BLACK);
width = width - (width % interval);
height = height - (height % interval);
for (int col=x; col <= x+width; col+=interval) {
g.drawLine(col, y, col, y+height);
}
for (int row=y; row <= y+height; row+=interval) {
g.drawLine(x, row, x+width, row);
}
}
class SubmitButton extends JButton implements ActionListener {
public SubmitButton(String title){
super(title);
addActionListener(this);
}
public void actionPerformed (ActionEvent e) {
maxPoints = Integer.parseInt(numPoint.getText()) * 2;
points.removeAll(); // clear JPanel so results from last aren't appended to
// delete this line and first enter 2 then 10 for # points
for (int i=0; i<maxPoints; i++) {
JTextField textField = new JTextField();
points.add(textField); // add to JPanel that gets displayed
pointsA.add(textField); // for getting values from later
}
matrix = new double[2][pointsA.size()/2]; // setting up dimension of matrix double[][]
points.validate();
points.repaint();
// What to Check:
// Things between commas are either spaces (which will be stripped later)
// or numbers!
// Pairs must match up!
}
}
class GenerateButton extends JButton implements ActionListener {
public GenerateButton (String title) {
super(title);
addActionListener(this);
}
public void actionPerformed (ActionEvent e) {
int c=0;
for (int i=0; i<pointsA.size()/2; i++) {
JTextField pointTF = pointsA.get(i);
Double point = Double.parseDouble(pointTF.getText());
matrix[0][c] = point;
c++;
}
c=0;
for (int i=pointsA.size()/2; i<pointsA.size(); i++) {
JTextField pointTF = pointsA.get(i);
Double point = Double.parseDouble(pointTF.getText());
matrix[1][c] = point;
c++;
}
for (int i=0; i<matrix.length; i++) {
for (int j=0; j<matrix[0].length; j++) {
System.out.println("i:"+i+"\t"+"j:"+j);
System.out.println(" "+matrix[i][j]);
}
}
}
}
}
解决方案
我不太确定到底你在问什么。通常情况下,你把所有的绘图功能,在paint()方法。然而,你通常要保留任何长时间运行的工作离AWT调度线程是同一个线程,你的按钮的actionPerformed()方法调用上的。为了使你的程序响应,您可能希望将其委托给一个SwingWorker的。
如果未显示您的应用程序,它可能是因为你还没有叫包()和show()(按顺序)的JPanel的初始化过程中。一般来说,你应该这样做,因为在你的init()方法的最后一件事。添加组件后或任何更改组件的状态,但在此之后,AWT线程可能会导致AWT让你生气,抛出异常。
如果你问如何绘制点自己,你应该看看Graphics.drawPolyline()和相关方法,你应该从你的paint()方法中调用。
如果你问如何从按键处理程序中绘制它们,你不知道。你调用重绘(),并让对象重绘自己对自己的时间。此外,你的情况,我不会理会subclasing的JButton。只是实现ActionListener。在您的init()方法,只需要创建两个按钮,并与他们注册你的听众。这也意味着,你不必重写它们的构造函数。
另外,你掩盖你的初始化期间提交()方法:它不会被引用也不是880。此外,我会用一个单独的X和Y阵列,而不是试图将它们组合成一个矩阵。你并不需要声明矩阵是公众,因为内部类已经可以看到也无妨。事实上,你可以(并且可能应该)宣布所有字段是私有的。你也有太多的神奇数字左右浮动,你是太多战斗摇摆方式:就让它做的工作奠定你所有的东西出来。你也应该尝试表现出尽可能小的问题,让我们来回答你的问题:这个排序到处都是流动的,是难以遵循
哦,为什么你的线未被绘制的真正原因:你叫重绘您的JPanel,而不是要画上的JFrame。如果你只需要调用重绘(),而不是points.repaint()的JFrame的需要绘制本身和它的所有儿童的照顾。
其他提示
您应该创建一个新的组件,并绘制点出现,而不是在框架它的自我。
阅读本:
http://java.sun.com/products/jfc/tsc /物品/绘画
然后你可以使用这样的:
http://java.sun.com /javase/6/docs/api/java/awt/Canvas.html
和将该对象添加到所述框架。