简体   繁体   English

Java:paintComponent没有被调用

[英]Java: paintComponent not being called

My full code (drag and drop code) (only class Surface and draw() function is manually): 我的完整代码(拖放代码)(只有类Surface和draw()函数是手动的):

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                   
}

I'm trying to draw line with x,y value get from spinner 我正在尝试从微调器获得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));

        }
    });
}

But paintComponent function in class Surface seem not being called. 但是似乎未调用Surface类中的paintComponent函数。
Please help 请帮忙

Problems: 问题:

  • Your controlPane is using GroupLayout, a layout that doesn't play nice when adding new components mid-stream 您的controlPane使用的是GroupLayout,该布局在中途添加新组件时效果不佳
  • You shouldn't even be adding a new component in your ChangeListener as it makes no sense. 您甚至不应该在ChangeListener中添加新组件,因为这没有任何意义。 Why continuously add new JPanels when all you want to do is change what is drawn? 当您要做的只是更改绘制的内容时,为什么要不断添加新的JPanels? Instead add your Surface JPanel on GUI creation and in the ChangeListener change the x1, y1, x2, y2 fields and call repaint() on it. 而是在GUI创建时添加Surface JPanel,并在ChangeListener中更改x1,y1,x2,y2字段并对其调用repaint()

Myself, I'd get rid of all the windows builder generated code, and simply make Surface the central JPanel of the GUI. 就我自己而言,我将摆脱所有Windows构建器生成的代码,而只需将Surface作为GUI的中央JPanel。 I'd create another JPanel that holds everything, give it a BorderLayout, add a single Surface instance to it BorderLayout.CENTER, and then in the ChangeListener, change this Surface's state and call repaint on it. 我将创建另一个包含所有内容的JPanel,为其提供BorderLayout,向其添加单个 Surface实例BorderLayout.CENTER,然后在ChangeListener中,更改此Surface的状态并对其进行重绘。

I've solved it. 我已经解决了 I forgot to set size and location for Surface(JPanel) 我忘了设置Surface(JPanel)的大小和位置

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM