i need your help badly because i cannot solve this problem on my own.
I am trying to create a GUI and want to draw something in it after pressing a button, but i seem to have some kind of refresh/revalidate or threading issue. The drawing is painted, but when I resize the window, the painting disappears. Also, when moving the window very quickly, parts of the drawing disappear. I have tried many things, but I can’t get this problem to work, maybe you can help me. I was instructed not to write my own code to begin with, but use the NetBeans Design functions to generate Buttons and Panels etc. Maybe this impairs the drawing process/functions, but I don’t know. I’ll post you the relevant code and would be very thankful for suggestions (the outcommented stuff are just artefacts from what I’ve tried before, so don’t mind it):
public class NewJFrame extends JFrame {
public NewJFrame() { initComponents(); }
@SuppressWarnings("unchecked")
private void initComponents() {
jButton1 = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(1200, 1000));
jButton1.setText("Draw");
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGap(0, 1000, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, 1000, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addComponent(jButton1)
.addGap(33, 33, 33))
);
layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 745, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(237, 237, 237))
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addContainerGap())))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(ActionEvent evt) {
Graphics g = jPanel1.getGraphics();
draw(jPanel1, g);
}
protected void paintComponent(Graphics g){
jPanel1.setSize(1000, 1000);
Dimension d = jPanel1.getSize();
g.setColor(Color.BLACK);
for (int i=0; i<=1000;i++){
if (i%100==0){
g.setColor(Color.RED);
g.drawLine(i, d.height/2, i, (d.height/2)+100);
}
else if(i%50==0 && i%100!=0){
g.setColor(Color.BLUE);
g.drawLine(i, d.height/2, i, (d.height/2)+100);
}
else {
g.setColor(Color.BLACK);
g.drawLine(i, d.height/2, i, (d.height/2)+100);
}
}
g.setColor(Color.green);
g.drawLine(0, d.height / 2, d.width, d.height / 2);
}
public void draw(JPanel Jpanel1, Graphics g) {
System.out.println("wuffkowski");
Jpanel1.setSize(1000,1000);
Dimension d = Jpanel1.getSize();
g.setColor(Color.BLACK);
for (int i=0; i<=1000;i++){
if (i%100==0){
g.setColor(Color.RED);
g.drawLine(i, d.height/2, i, (d.height/2)+100);
}
else if(i%50==0 && i%100!=0){
g.setColor(Color.BLUE);
g.drawLine(i, d.height/2, i, (d.height/2)+100);
}
else {
g.setColor(Color.BLACK);
g.drawLine(i, d.height/2, i, (d.height/2)+100);
}
}
g.setColor(Color.green);
g.drawLine(0, d.height / 2, d.width, d.height / 2);
Jpanel1.paintComponents(g);
}
public static void lala () {
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);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
NewJFrame JF =new NewJFrame();
JF.setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JPanel jPanel1;
}
Again thanks a lot for your precious time.
Java doesn’t remember drawing commands for you; your graphic is rendered once when you click the button because that’s the only time when
draw()is called.If you want to refresh the rendering after a resize, override
paint(Graphics)and calldraw()in there.If that is related to the button click, you must add fields to your class in which you remember everything that you need in
draw()including the fact whether it should draw anything:Further reading: