/ / Metoda malowania w klasie, na Jpanelu, tryb projektowania w Netbeans - java, swing, netbeans, applet, paint

Metoda malowania w klasie, na Jpanel, tryb projektowania w Netbeans - java, swing, netbeans, applet, paint

Próbowałem zaprogramować aplet z Netbeans zdolny do rysowania grafiki w jPanel, jak widać: ! [wprowadź opis zdjęcia tutaj] [1]

Formularz apletu:

package Experimento2;

import javax.swing.*;
import java.awt.*;


public class Experimento2 extends javax.swing.JApplet {


public void init() {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jPanel1 = new javax.swing.JPanel();
//ZonaGrafica zg = new ZonaGrafica();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 466, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 259, Short.MAX_VALUE)
);

jButton1.setText("jButton1");

jButton2.setText("jButton2");

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(27, 27, 27)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 54, Short.MAX_VALUE)
.addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(23, 23, 23))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(85, 85, 85)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(37, 37, 37))
);

//jPanel1.add(zg,BorderLayout.CENTER);
//zg.repaint();
}// </editor-fold>


// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JPanel jPanel1;
// End of variables declaration

}

I klasa ZonaGrafica, która znajduje się w tym samym pakiecie:

package Experimento2;

import javax.swing.JApplet;
import java.awt.*;

public class ZonaGrafica extends JApplet{

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

g.setColor(Color.red);
g.fillOval(45, 65, 34, 54);
g.fillOval(45, 120, 34, 54);
g.fillOval(45, 180, 34, 54);
}
}

Ale niestety nic się nie dzieje, gdy uruchamiamjApplet form. W miejscu, w którym metoda malowania ma narysować czerwone owale, nic nie jest pokazane. Nie mam pojęcia, jak rozwiązać ten problem i byłbym wdzięczny za to, kto mógłby mi pomóc w rozwiązaniu tego problemu.

Odpowiedzi:

3 dla odpowiedzi № 1

Nie zastępuj farby. Spróbuj paintComponent zamiast.

Twój obiekt ZonaGrafica nigdy nie jest tworzony (skomentowany). Mam nadzieję, że przynajmniej to robisz.

Oprócz tego próbujesz dodać JApplet (ZonaGrafica) do innego JApplet (Experimento2). Refaktoryzuj ZonaGrafica i pozwól mu rozszerzyć JPanel lub JLabel.


1 dla odpowiedzi nr 2

Edytor formularzy „działałby” z dowolnym przesłonięciem paint lub paintComponent, choć sugeruje to Heisenbug paintComponent jest nadal dobry.

Po przeczytaniu kodu myślę, że po prostu nacisnąłeś przycisk „dostosuj kod”, dodałem kilka linii i pomyślałem, że to by go posortowało. Nie działa, ponieważ:

  1. GroupLayout nie działa w ten sposób someContainer.add() podejście do dodawania interfejsu użytkownika.
  2. Mówiąc o tym, stała układu granic nie ma sensu.
  3. A w czasie projektowania kod nawet nie działa,tak czy siak. Edytor formularzy korzysta z dokumentu XML, aby śledzić, które komponenty i jak tworzyć, więc nie zobaczysz swojej niestandardowej logiki malowania, nawet jeśli zrobiłbyś coś takiego jak dodanie JPanel i dostosowanie konstruktora do odczytu np. jPanel3 = new ZonaGrafica();. Co prowadzi mnie do:
  4. Jedyny sposób na pokazanie komponentuwłaściwie w czasie projektowania należy najpierw go skompilować, a następnie dodać do formularza za pomocą funkcji „Dodaj Java Bean” edytora. Jeśli twój kod podklasuje JPanel, będzie zachowywał się jak JPanel w edytorze formularzy, jeśli podklasuje JButton, będzie zachowywał się jak JButton i tak dalej ... To także eliminuje potrzebę szybkich hacków w części „Dostosuj kod” Edytor.

Podsumowując: (1) skompiluj kod, (2), a następnie dodaj ZoneGrafica za pomocą funkcji „Dodaj Java Bean”. Musisz znać jego w pełni kwalifikowaną nazwę klasy (np. com.foo.ZonaGrafica) za to.