如何在绘制多边形后清除Netbeans中的JFrame

时间:2015-02-13 01:56:40

标签: java netbeans jframe polygon repaint

我制作了这个程序,在JFrame中绘制一个多边形然后填充它。我最近更改了它,以便我有控制多边形移动的按钮。除了一个问题之外,该运动也起作用:当我按下按钮以移动方向时,在新的点中创建一个新的多边形,但原始的仍保持可见。

我需要的是在调用repaint()之前清除JFrame,因为调用repaint()本身并没有清除JFrame(即使我认为应该这样)。

我已经尝试了以下内容:

removeAll();
revalidate();
repaint();

但我没有运气。

编辑:这是我的班级

public class Assign3 extends javax.swing.JPanel 
{

       /**
 * Creates new form Assign3
 */
public Assign3() 
{
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jButton3 = new javax.swing.JButton();
    jButton4 = new javax.swing.JButton();
    jButton5 = new javax.swing.JButton();
    jButton6 = new javax.swing.JButton();
    jButton7 = new javax.swing.JButton();
    jButton8 = new javax.swing.JButton();

    jButton3.setText("Up");
    jButton3.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton3ActionPerformed(evt);
        }
    });

    jButton4.setText("Down");
    jButton4.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton4ActionPerformed(evt);
        }
    });

    jButton5.setText("Left");
    jButton5.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton5ActionPerformed(evt);
        }
    });

    jButton6.setText("Right");
    jButton6.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton6ActionPerformed(evt);
        }
    });

    jButton7.setText("Zoom (+)");
    jButton7.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton7ActionPerformed(evt);
        }
    });

    jButton8.setText("Zoom (-)");
    jButton8.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton8ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(272, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton6, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton7, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton8, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(18, 18, 18))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addGap(30, 30, 30)
            .addComponent(jButton3)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton4)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton5)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton6)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton7)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton8)
            .addContainerGap(102, Short.MAX_VALUE))
    );
}// </editor-fold>                        

//UP PRESSED
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //1) get the current y coordinates
    //2) move the y coordinates up

    upPressed();
}                                        

//DOWN BUTTON
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //1) get the current y coordinates
    //2) move the y coordinates down

    downPressed();
}                                        

//LEFT BUTTON
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //1) get the current x coordinates
    //2) move the x coordinates to the left

    leftPressed();
}                                        

//RIGHT BUTTON
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //1) get the current x coordinates
    //2) move the x coordinates to the right

    rightPressed();
}                                        

//ZOOM IN BUTTON
private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //translate center to origin
    //caculate scaling
    //tanslate back

    zoomInPressed();
}                                        

//ZOOM OUT BUTTON
private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:

    zoomOutPressed();
}                                        
//UP BUTTON
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //1) get the current y coordinates
    //2) move the y coordinates up

    upPressed();
}                         

int left_most_edge, right_most_edge, scan = 0;
int wxl = 50, wxh = 362, wyl = 246, wyh = 62;
double[] xcoord;
double[][] table = new double[4][200];  //2d array containing: 
                                        //[0][-] -> ymax, [1][-] -> ymin, [2][-] -> dx, [3][-] -> x
double[] px = {100, 150, 250, 300, 250, 150, 100}; //contains all x coord.
double[] py = {125, 100, 200, 150, 100, 200, 200}; //contains all y coord.
int outnum;
double[] lastl = new double[2];
double[] lastr = new double[2];
double[] lastt = new double[2];
double[] lastb = new double[2];

public void initializeTable() 
{
    int i, j;

    for (i = 0; i < 4; i++) 
    {
        for (j = 0; j < 200; j++) 
        {
            table[i][j] = 0;
        }//end for
    }//end for
}//end initializeTable

public void upPressed() 
{
    for (int i = 0; i < py.length; i++) 
    {
        py[i] -= 5;
    }//end for
    repaint();
}//end upPressed

public void downPressed() 
{
    for (int i = 0; i < py.length; i++) 
    {
        py[i] += 5;
    }//end for
    repaint();
}//end upPressed

public void leftPressed() 
{
    for (int i = 0; i < px.length; i++) 
    {
        px[i] -= 5;
    }//end for
    repaint();
}//end upPressed

public void rightPressed() 
{
    for (int i = 0; i < px.length; i++) 
    {
        px[i] += 5;
    }//end for
    repaint();
}//end upPressed

public void zoomInPressed() 
{

}//end zoomInPressed

public void zoomOutPressed() 
{

}//end zoomOutPressed

public void clipPolygon(Graphics g, int number_entered_edges) 
{
    lastl[0] = px[number_entered_edges - 1];
    lastl[1] = py[number_entered_edges - 1];

    lastr[0] = wxl;
    lastb[0] = wxl;
    lastt[0] = wxl;
    lastr[1] = wyl;
    lastb[1] = wyl;
    lastt[1] = wyl;

    outnum = 0;

    for (int i = 0; i < number_entered_edges - 1; i++) 
    {
        clipL(px[i], py[i]);
    }//end for

    outnum = 0;

    for (int i = 0; i < number_entered_edges - 1; i++) 
    {
        clipL(px[i], py[i]);
    }//end for
}//end clipPolygon

public void clipL(double x, double y) 
{
    if ((lastl[0] < wxl && wxl <= x) || (x <= wxl && wxl < lastl[0])) 
        clipR(wxl, (((y - lastl[1]) * (wxl - x)) / x - lastl[0]) + y);

    lastl[0] = x;
    lastl[1] = y;

    if (wxl < x)
        clipR(x, y);
}//end clipL

public void clipR(double x, double y) 
{
    if ((x <= wxh && wxh < lastr[0]) || (lastr[0] < wxh && wxh <= x)) 
        clipB(wxh, (((y - lastr[1]) * (wxh - x)) / x - lastr[0]) + y);

    lastr[0] = x;
    lastr[1] = y;

    if (x < wxh)
        clipB(x, y);
}//end clipR

public void clipB(double x, double y) 
{
    if ((lastb[1] < wyl && wyl <= y) || y <= wyl && wyl < lastb[1]) 
        clipT((((x - lastb[0]) * (wyl - y)) / y - lastb[1]) + x, wyl);
    lastb[0] = x;
    lastb[1] = y;

    if (wyl < y)
        clipT(x, y);
}//end clipB

public void clipT(double x, double y) 
{
    if ((lastt[1] > wyh && wyh >= y) || y >= wyh && wyh > lastt[1])
        store((((x - lastt[0]) * (wyh - y)) / y - lastt[1]) + x, wyh);

    lastt[0] = x;
    lastt[1] = y;

    if (wyh > y)
        store(x, y);
}//end clipT

public void store(double x, double y) 
{
    outnum++;
    px[outnum] = x;
    py[outnum] = y;
}//end store

public double max(double x, double y)
{ //determines the greater of two values
    double max;
    if (x > y) 
        max = x;
    else 
        max = y;
    return max;
}//end max

public void edgeInsert(double xStart, double yStart, double xEnd, double yEnd, int number_entered_edges) 
{ //inserting edges into the edge table
    int j = number_entered_edges; //removing the - 1 removes line on left side
    double x;

    if (yStart > yEnd) 
    {
        table[0][j] = yStart;
        table[1][j] = yEnd;
    }//end if
    else 
    {
        table[0][j] = yEnd;
        table[1][j] = yStart;
    }//end else

    if (table[1][j] == xStart)
        x = xStart;
    else 
        x = xEnd;

    if (table[0][j] == yStart)
        table[2][j] = -(-(xEnd - xStart) / (yEnd - yStart));
    else
        table[2][j] = -(xEnd - xStart) / (yEnd - yStart);

    table[3][j] = x + table[2][j] / 2;

    help(j);
}//end edgeInsert

public void loadTable(int number_vertices, int number_entered_edges,
        double[] px, double[] py) 
{ //take the x and y coordinates and build an edge table based off of them
    int k;
    double xStart, yStart, xEnd, yEnd;

    xStart = px[number_vertices - 1];
    yStart = trunc(py[number_vertices - 1]) + 0.5;

    //start off with no edges in edge table
    number_entered_edges = 0;
    for (k = 0; k < number_vertices; k++) 
    {
        xEnd = px[k];
        yEnd = trunc(py[k]) + 0.5;

        if (yStart == yEnd) 
        {
            xStart = xEnd;
        }//end if
        else 
        {
            //add edge to edge table
            number_entered_edges++;
            edgeInsert(xStart, yStart, xEnd, yEnd, number_entered_edges);

            yStart = yEnd;
            xStart = xEnd;
        }//end else
    }//end for
    scan = (int) trunc(table[1][0]); //start at the top of the polygon
}//end loadTable

public void include(int number_entered_edges) 
{ //pushing the right most edge
    while ((right_most_edge + 1 < number_entered_edges) && (table[1][right_most_edge + 1] < scan)) 
    {
        right_most_edge++;
    }//end while
}//end include

public void exclude() 
{ //excluding edges that we no longer care about
    for (int i = left_most_edge; i <= right_most_edge; i++) 
    {
        if (table[0][i] < scan) 
        {
            left_most_edge++;
            for (int j = i; j >= left_most_edge; j--) 
            {
                table[0][j] = table[0][j - 1];
                table[2][j] = table[2][j - 1];
                table[3][j] = table[3][j - 1];
            }//end for
        }//end if
    }//end for
}//end exclude

public void help(int i) 
{
    double helpX, helpDX, helpYMax, helpYMin;
    for (int j = i - 1; j >= 0; j--) 
    {
        if ((table[1][j] == table[1][j + 1] && table[3][j] > table[3][j + 1]) || table[1][j] > table[1][j + 1]) 
        {
            helpYMax = table[0][j];
            table[0][j] = table[0][j + 1];
            table[0][j + 1] = helpYMax;

            helpYMin = table[1][j];
            table[1][j] = table[1][j + 1];
            table[1][j + 1] = helpYMin;

            helpDX = table[2][j];
            table[2][j] = table[2][j + 1];
            table[2][j + 1] = helpDX;

            helpX = table[3][j];
            table[3][j] = table[3][j + 1];
            table[3][j + 1] = helpX;
        }//end if
    }//end for
}//end help

public void updateX() 
{ //increment x based on dx
    for (int i = left_most_edge; i <= right_most_edge; i++) 
    {
        table[3][i] += table[2][i];
    }//end for
}//end updateX

public void sortOnX() 
{ //sorting x values from least to greatest in edge table
    int l = 0;
    double t;
    xcoord = new double[right_most_edge - left_most_edge + 1];

    for (int i = left_most_edge; i <= right_most_edge; i++) 
    {
        xcoord[l] = table[3][i];
        for (int j = l - 1; j >= 0; j--) 
        {
            if (xcoord[j] > xcoord[j + 1]) 
            {
                t = xcoord[j];
                xcoord[j] = xcoord[j + 1];
                xcoord[j + 1] = t;
            }//end if
        }//end for

        l++;
    }//end for
}//end sortOnX

public void fillScan(Graphics g) 
{ //determines the line to be drawn for filling
    for (int i = 0; i < xcoord.length; i += 2) 
    {
        drawMyHorizontalLine(g, (int) Math.round(xcoord[i]), scan, (int) Math.round(xcoord[i + 1]));
    }//end for
}//end fillScan

public double trunc(double num) 
{ //trucates the number passed in to remove any decimal
    double rem;
    if ((num % 2) == 0)
        return num;
    else
    {
        rem = num % 2;
        return num - rem;
    }//end else
}//end trunc

public void drawMyPolygon(Graphics g) 
{ //draws the polygon
    g.setColor(Color.RED);
    g.drawLine((int) px[0], (int) py[0], (int) px[1], (int) py[1]);
    g.drawLine((int) px[1], (int) py[1], (int) px[2], (int) py[2]);
    g.drawLine((int) px[2], (int) py[2], (int) px[3], (int) py[3]);
    g.drawLine((int) px[3], (int) py[3], (int) px[4], (int) py[4]);
    g.drawLine((int) px[4], (int) py[4], (int) px[5], (int) py[5]);
    g.drawLine((int) px[5], (int) py[5], (int) px[6], (int) py[6]);
    g.drawLine((int) px[6], (int) py[6], (int) px[0], (int) py[0]);
}//end drawMyPolygon

public void drawMyHorizontalLine(Graphics g, int x1, int y, int x2) 
{ //draws the line for filling
    g.setColor(Color.GREEN);
    g.drawLine(x1, y, x2, y);
}//end drawMyHorizontalLine

public void fillMyPolygon(Graphics g, int number_vertices, int number_entered_edges) 
{ //calls methods to deal with edge table and fill the polygon
    if (number_entered_edges < 3 || number_entered_edges > 200) 
    {
        System.out.println("Polygon size error");
    }//end if
    else 
    {
        loadTable(number_vertices, number_entered_edges, px, py);
        while (left_most_edge < number_entered_edges) {
            scan++; //move down the screen
            exclude();
            updateX();
            include(number_entered_edges);
            sortOnX();
            fillScan(g);
        }//end while
    }//end else
}//end fillMyPolygon

public void drawWindow(Graphics g) 
{
    g.setColor(Color.BLACK);
    g.drawLine(50, 62, 50, 246);
    g.drawLine(50, 62, 362, 62);
    g.drawLine(50, 246, 362, 246);
    g.drawLine(362, 62, 362, 246);
}//end drawWindow

public void buttons() 
{
    jButton1.setVisible(true);
    jButton2.setVisible(true);
    jButton3.setVisible(true);
    jButton4.setVisible(true);
    jButton5.setVisible(true);
    jButton6.setVisible(true);
}//end buttons

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);

    //initialize the edge table to all zeroes
    initializeTable();

    clipPolygon(g, 7);

    //begin filling the polygon
    fillMyPolygon(g, 7, 7);

    //draw polygon with red outline
    drawMyPolygon(g);

    //draw viewing window
    drawWindow(g);

    //set buttons to visible
    buttons();
}//end paintComponent

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
private javax.swing.JButton jButton6;
private javax.swing.JButton jButton7;
private javax.swing.JButton jButton8;
// End of variables declaration            
}

3 个答案:

答案 0 :(得分:1)

绘制到JFrame是否不赞成......这无关紧要,因为这只是为了学习经验而且我知道我应该绘制到JPanel。我只是通过添加super.paint(g)修复了我的问题。在我对paint()方法的调用中调用。

答案 1 :(得分:0)

JFrame是一个没有实际显示的对象。它只是一个容纳其他GUI对象的容器,例如JPanel,后者又支持JButtons等。

话虽这么说,你所有的实际绘画都应该在Panel中进行,而不是Frame。此外,您是否拥有用于绘制和绘制多边形的其余代码?那里也可能发生一些事情。

答案 2 :(得分:0)

很难说根据您提供的最新信息可能出现什么问题,所以我能做的就是提供一般性建议:

  • 首先,如我的评论所述,不要直接在JFrame中绘制。 JFrame是一个复杂的容器,可以容纳和显示许多组件,包括根窗格,玻璃窗格,菜单栏和内容窗格(GUI的中央主要部分),如果你弄乱它们的绘图和显示,你可能会搞乱它们的渲染他们的组件。
  • 而是创建一个扩展JPanel的类(如果你允许的话,NetBeans可以这样做),并在这个类的paintComponent(...)方法内部绘制。
  • 然后根据需要在JFrame(或JDialog,JApplet,另一个JPanel ......)中显示您的JPanel。
  • 始终在JPanel的paintComponent覆盖中调用super的paintComponent方法。这将删除旧图像。
  • 阅读Swing图形教程了解详情。
  • 如果您需要更多帮助,请显示更多代码。