Метод рисования в классе, на Jpanel, режим проектирования в Netbeans - PullRequest
2 голосов
/ 31 декабря 2011

Я пытался запрограммировать апплет с Netbeans, способным рисовать некоторую графику в jPanel, как вы можете видеть:! [Введите описание изображения здесь] [1]

Форма апплета:

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

}

И класс ZonaGrafica, который находится в том же пакете:

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);
    }
}

Но, к сожалению, ничего не происходит, когда я запускаю форму jApplet.В том месте, где метод рисования должен рисовать красные овалы, ничего не показано.Я понятия не имею, чтобы решить эту проблему, и я был бы признателен, кто мог бы помочь мне решить эту проблему ..

Ответы [ 2 ]

3 голосов
/ 31 декабря 2011

Не перекрывайте краску.Попробуйте вместо этого paintComponent .

Ваш объект ZonaGrafica никогда не создается (комментируется).Я надеюсь, что вы по крайней мере делаете это.

В дополнение к этому вы пытаетесь добавить JApplet (ZonaGrafica) в другой JApplet (Experimento2).Рефакторинг ZonaGrafica и пусть он расширяет JPanel или JLabel.

1 голос
/ 31 декабря 2011

Редактор форм «будет» работать либо с переопределенными paint, либо с paintComponent, хотя предложение Гейзенбага сделать его paintComponent все еще хорошо.

Читая ваш код, я думаю, что выпросто нажмите кнопку «настроить код», добавьте несколько строк и подумайте, что бы это отсортировать.Это не так, потому что:

  1. GroupLayout не работает таким образом.Это совсем не похоже на someContainer.add() подход добавления пользовательского интерфейса.
  2. Кстати, константа макета Border не имеет смысла.
  3. А во время разработки код даже небеги, во всяком случае.Редактор форм использует документ XML для отслеживания того, какие компоненты и как создавать экземпляры, чтобы вы не увидели свою собственную логику рисования, даже если бы вы сделали что-то вроде добавления JPanel и настройки конструктора для чтения, например, jPanel3 = new ZonaGrafica();.Что подводит меня к следующему:
  4. Единственный способ заставить компонент правильно отображаться во время разработки - это сначала скомпилировать его, а затем добавить в форму с помощью функции «Добавить компонент Java» редактора.Если ваш код подклассов JPanel, он будет вести себя как JPanel в редакторе форм, если он подклассов JButton, он будет вести себя как JButton и т. Д. Это также устраняет необходимость каких-либо быстрых взломов в части «Настройка кода»редактор.

Итак, подведем итог: (1) скомпилируйте ваш код, (2) затем добавьте ZoneGrafica, используя функцию «Добавить Java Bean».Для этого вам нужно знать его полное имя класса (например, com.foo.ZonaGrafica).

...