2016-11-17 77 views
0

我完整的代码(拖放代码)(唯一一类表面和Draw()函数是手动):Java的:没有的paintComponent被称为

import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.text.DefaultFormatter; 


class Surface extends JPanel { 
int x1,y1,x2,y2; 

public Surface(){ 

} 

public Surface(int x1,int y1,int x2,int y2){ 
    this.x1=x1; 
    this.y1=y1; 
    this.x2=x2; 
    this.y2=y2; 
} 

private void doDrawing(Graphics g) { // 3 
    Graphics2D g2d = (Graphics2D) g; 

    g2d.drawLine(x1, y1, x2, y2); 
} 


@Override 
public void paintComponent(Graphics g) { // 2 
    super.paintComponent(g); 
    doDrawing(g); 
} 
} 
public class NewJFrame extends JFrame { 

int x1,y1,x2,y2; 

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

private void draw(){ 
    xSpinner.addChangeListener(new ChangeListener() { 
     @Override 
     public void stateChanged(ChangeEvent e) { 
      x1=(int) ((JSpinner)e.getSource()).getValue(); 
      add(new Surface(x1,y1,x2,y2)); 

     } 
    }); 
} 

/** 
* 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() { 

    controlPanel = new javax.swing.JPanel(); 
    xSpinner = new javax.swing.JSpinner(); 
    ySpinner = new javax.swing.JSpinner(); 
    widthSpinner = new javax.swing.JSpinner(); 
    heightSpinner = new javax.swing.JSpinner(); 
    xLabel = new javax.swing.JLabel(); 
    yLabel = new javax.swing.JLabel(); 
    widthLabel = new javax.swing.JLabel(); 
    heightLabel = new javax.swing.JLabel(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    xLabel.setText("x"); 

    yLabel.setText("y"); 

    widthLabel.setText("width"); 

    heightLabel.setText("height"); 

    javax.swing.GroupLayout controlPanelLayout = new javax.swing.GroupLayout(controlPanel); 
    controlPanel.setLayout(controlPanelLayout); 
    controlPanelLayout.setHorizontalGroup(
     controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, controlPanelLayout.createSequentialGroup() 
      .addGap(36, 36, 36) 
      .addComponent(xLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(xSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(21, 21, 21) 
      .addComponent(yLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(ySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 63, Short.MAX_VALUE) 
      .addComponent(widthLabel) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(widthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(31, 31, 31) 
      .addComponent(heightLabel) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(heightSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(17, 17, 17)) 
    ); 
    controlPanelLayout.setVerticalGroup(
     controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(controlPanelLayout.createSequentialGroup() 
      .addGap(22, 22, 22) 
      .addGroup(controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(ySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(widthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(xLabel) 
       .addComponent(yLabel) 
       .addComponent(widthLabel) 
       .addComponent(heightLabel) 
       .addComponent(xSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(heightSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addContainerGap(258, Short.MAX_VALUE)) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(controlPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(controlPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
    ); 

    pack(); 
}// </editor-fold>       

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new NewJFrame().setVisible(true); 
     } 
    }); 
} 

// Variables declaration - do not modify      
private javax.swing.JPanel controlPanel; 
private javax.swing.JLabel heightLabel; 
private javax.swing.JSpinner heightSpinner; 
private javax.swing.JLabel widthLabel; 
private javax.swing.JSpinner widthSpinner; 
private javax.swing.JLabel xLabel; 
private javax.swing.JSpinner xSpinner; 
private javax.swing.JLabel yLabel; 
private javax.swing.JSpinner ySpinner; 
// End of variables declaration     
} 

我试图绘制X线,Y值从微调

private void draw(){ 
    xSpinner.addChangeListener(new ChangeListener() { 
     @Override 
     public void stateChanged(ChangeEvent e) { 
      x1=(int) ((JSpinner)e.getSource()).getValue(); 
      add(new Surface(x1,y1,x2,y2)); 

     } 
    }); 
} 

但功能的paintComponent类表面获得似乎没有被调用。
请帮助

回答

1

问题:

  • 你controlPane使用的GroupLayout,布局增加新的组件中流
  • 你甚至不应该在添加新的组件时没有发挥好你的ChangeListener,因为它没有任何意义。为什么不断添加新的JPanel,当你想要做的就是改变绘制的内容?相反,在GUI创建时添加Surface JPanel,并在ChangeListener中更改x1,y1,x2,y2字段并在其上调用repaint()

我自己,我摆脱所有的窗口生成器生成的代码,并简单地让表面的中央JPanel的GUI。我会创建另一个容纳所有东西的JPanel,给它一个BorderLayout,向它的BorderLayout.CENTER添加一个Surface实例,然后在ChangeListener中,改变这个Surface的状态并调用它的重绘。

+0

我弄错了我的逻辑。但是我想在完成代码之前确保类Surface的工作。但是没有画在屏幕上,因为paintComponent没有被调用。 –

-1

我解决了它。我忘了为Surface设置尺寸和位置(JPanel)

相关问题