Java рисует треугольник и пытается использовать другие объекты Swing - PullRequest
3 голосов
/ 22 сентября 2011

У меня возникли некоторые проблемы с использованием Netbeans для разработки графического интерфейса (да, я ленивый: \) и попыткой вручную нарисовать треугольник на JFrame. Компоненты Swing «закрыты», пока я не нажму вкладку и не наведу фокус на объекты. Я приложил картинку и код ниже выпуска.

Весь автоматически сгенерированный код для GUI находится в части кода initComponents (). И создание Triage находится в коде переопределения для метода JFrame Paint. Похоже, происходит то, что код initComponents запускается до рисования, поскольку объект создается до setVisibile (true). После вызова setVisible (true) метод рисования закрашивает все созданные объекты initComponents. Просто ищу решение, чтобы ничто не скрывалось.

Любая помощь будет оценена.

 $/*
  * To change this template, choose Tools | Templates
  * and open the template in the editor.
  */

 /*
  * SimpleClient.java
  *
  * Created on Sep 22, 2011, 11:38:30 AM
  */
 package Assignment3;

 import java.awt.Graphics;

 /**
  *
  * @author Mark
  */
 public class SimpleClient extends javax.swing.JFrame {

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

public void paint(Graphics g) {
    int[] xPoints = {100, 100, 200};
    int[] yPoints = {100, 200, 200};
    g.drawPolygon(xPoints, yPoints, 3);
}

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

    jTextField1 = new javax.swing.JTextField();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTextField1.setText("jTextField1");

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(103, 103, 103)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(238, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(220, Short.MAX_VALUE)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(60, 60, 60))
    );

    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(SimpleClient.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(SimpleClient.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(SimpleClient.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(SimpleClient.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 SimpleClient().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
private javax.swing.JTextField jTextField1;
// End of variables declaration
}

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Несколько быстрых рекомендаций:

  • Не рисуйте непосредственно в JFrame.
  • Рисуйте вместо этого в JComponent, таком как JPanel.
  • Переопределите paintComponentметод JPanel, а не метод рисования.
  • Вызовите super.paintComponent (g), как правило, в качестве первого вызова метода вашего метода paintComponent, чтобы разрешить вашему JPanel вести домашнюю работу и удалять старые изображения.
  • Прочитайте несколько руководств по графике Swing, потому что для многих из нас (особенно для меня) это не интуитивно понятно, и вам придется нарушить некоторые предположения, чтобы сделать это правильно.
4 голосов
/ 22 сентября 2011

Не переопределяйте метод paint () контейнера верхнего уровня (JFrame, JDialog ...).

Пользовательское рисование выполняется путем переопределения метода paintCompnent () для JPanel (или JComponent). Затем вы добавляете компонент на панель содержимого фрейма. Не забудьте также переопределить метод getPreferredSize () компонента, чтобы менеджеры компоновки работали правильно.

Прочтите Custom Painting для получения дополнительной информации и рабочих примеров.

...