2009-12-26 2 views
0

У меня есть графический интерфейс, написанный с использованием netbeans с несколькими простыми компонентами на месте. Я хочу, чтобы иметь возможность рисовать изображения (любой тип файла, что бы ни было проще) вместе с компонентами GUI внутри JFrame.Простые изображения изображений в Java

Не нужно изменять их размеры, просто нарисуйте их так, как они есть, в выбранном мной месте x и y. На каждом обновлении будет отображаться несколько изображений, некоторые из них будут скрыты, а другие будут отображаться. Обновление будет происходить каждые 5 секунд или около того, так что это быстро не проблема.

Если было бы возможно связать события с изображениями, которые были бы нажаты, это было бы неплохо, но не обязательно.

Это чрезвычайно простая задача, перед которой я пока не смог получить простой ответ.

Как мне это сделать?

Благодаря

package Pokertable; 

/* * Для того, чтобы изменить этот шаблон, выберите Tools | Шаблоны * и откройте шаблон в редакторе. */

/* * ClientWindow.java * * Создан 12 сен 2009, 9:10:48 PM */

/** * * @author Роберт */ общественного класса ClientWindow расширяет javax.swing.JFrame {

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

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

    jScrollPane1 = new javax.swing.JScrollPane(); 
    jTextField1 = new javax.swing.JTextField(); 
    jScrollPane2 = new javax.swing.JScrollPane(); 
    jTextArea1 = new javax.swing.JTextArea(); 
    jCheckBox2 = new javax.swing.JCheckBox(); 
    imagePanel1 = new Pokertable.ImagePanel(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setTitle("Not Logged In"); 
    getContentPane().setLayout(null); 

    jTextField1.addKeyListener(new java.awt.event.KeyAdapter() { 
     public void keyTyped(java.awt.event.KeyEvent evt) { 
      jTextField1KeyTyped(evt); 
     } 
    }); 
    jScrollPane1.setViewportView(jTextField1); 

    getContentPane().add(jScrollPane1); 
    jScrollPane1.setBounds(0, 540, 170, 22); 

    jTextArea1.setColumns(20); 
    jTextArea1.setRows(5); 
    jScrollPane2.setViewportView(jTextArea1); 

    getContentPane().add(jScrollPane2); 
    jScrollPane2.setBounds(0, 440, 166, 96); 

    jCheckBox2.setText("Sit Out Next Hand"); 
    jCheckBox2.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jCheckBox2ActionPerformed(evt); 
     } 
    }); 
    getContentPane().add(jCheckBox2); 
    jCheckBox2.setBounds(0, 410, 113, 23); 
    getContentPane().add(imagePanel1); 
    imagePanel1.setBounds(130, 130, 100, 100); 

    pack(); 
}// </editor-fold> 

private void jCheckBox2ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
}           

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {          
    // TODO add your handling code here: 
}          


/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new ClientWindow().setVisible(true); 
     } 
    }); 
} 

// Variables declaration - do not modify 
private Pokertable.ImagePanel imagePanel1; 
private javax.swing.JCheckBox jCheckBox2; 
private javax.swing.JScrollPane jScrollPane1; 
private javax.swing.JScrollPane jScrollPane2; 
private javax.swing.JTextArea jTextArea1; 
private javax.swing.JTextField jTextField1; 
// End of variables declaration 

}

ответ

5

Создайте пользовательский компонент, и добавить его в паллет NetBeans:

public class ImagePanel extends JPanel { 

    private Image img; 

    public void setImage(String img) { 
    setImage(new ImageIcon(img).getImage()); 
    } 

    public void setImage(Image img) { 
    int width = this.getWidth(); 
    int height = (int) (((double) img.getHeight(null)/img.getWidth(null)) * width); 
    this.img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
    g.drawImage(img, 0, 0, this); 
    } 
} 

Я включил некоторое простое масштабирование, вы можете удалить его, если вам нравится.

Немного объяснений Сейчас:

  • расширения JPanel делает компонент соответствует JavaBean спецификации. Если вы хотите установить свойство img через редактор свойств NetBeans, вы должны определить simpel getter;
  • в противном случае вы можете вручную вызвать setImage() и вызвать repaint(), что сделает изображение рисовать
  • переопределенном paintComponent метод вызывается на каждом перекрашивать компонента, и там, вы можете видеть, вы рисуете изображение в boundries из текущий JPanel (ImagePanel)
+0

У меня нет большого опыта работы с netbeans, поэтому это выглядит великолепно, но я не уверен, как его использовать. Как добавить класс в качестве настраиваемого компонента? Как и когда эти объекты получают экземпляр? Также само изображение не может знать, должно ли оно быть видимым, и если да, то где оно должно быть нарисовано при каждом обновлении. Эта информация находится в другом классе, который будет периодически переходить к графике, чтобы обновлять себя, с информацией о том, что должно отображаться и где. Еще раз спасибо за помощь ... это будет огромный шаг вперед. – Allen

+0

Теперь я не могу вспомнить, где именно была кнопка «добавить в палитру», но ищите ее, ее не должно быть трудно найти. Затем вы выбираете свой класс и добавляете его. Вы можете перетащить класс из учебника пакета на свою форму, и он появится там. Видимость JPanel контролируется в суперклассе JPanel, поэтому не беспокойтесь об этом. Просто попробуйте. – Bozho

+0

Неважно, насколько я могу сделать компонент ImagePanel относительно размера изображений, которые я хочу отобразить? Нужна ли мне одна из этих панелей на изображение? Где в коде выше можно вызвать метод setImage()? Кроме того, я не могу просто перетащить все на место раньше времени, так как изображения будут отображаться при различных координатах x и y. Итак, как мне добавить их «на лету», по месту моего выбора и как удалить существующий из представления в заданном цикле обновления? – Allen

Смежные вопросы