Отображение компонентов графического интерфейса в Java - PullRequest
0 голосов
/ 20 декабря 2009

У меня есть окно с графическим интерфейсом, которое я создал, используя Netbeans. Затем я перенес код в свою собственную программу, так что я могу отображать .png по своему желанию.

Однако компоненты графического интерфейса не отображаются, и по умолчанию открывается окно без размера.

Мне нужно, чтобы окно было изначально открыто с видимыми компонентами GUI, с окном правильного размера, чтобы все было видно.

Кто-нибудь может мне помочь?

спасибо

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

public class AwtImage extends javax.swing.JFrame {

    private Image img;

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

    public static void main(String[] args){
        AwtImage ai = new AwtImage();
    }

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

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

        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:
    }               



    public AwtImage() {
        super("Image Frame");
        MediaTracker mt = new MediaTracker(this);
        img = Toolkit.getDefaultToolkit().getImage("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
        mt.addImage(img,0);
        setSize(600,600);


        initComponents();
        setVisible(true);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we) {
                dispose();
            }
        });
    }

    public void update(Graphics g){
        paint(g);
    }

    public void paint(Graphics g) {
        if(img != null)
            g.drawImage(img, 0, 10, this);
       // else
        //    g.clearRect(0, 0, getSize().width, getSize().height);
    }
}

альтернативный текст http://img41.imageshack.us/img41/9795/openn.png альтернативный текст http://img709.imageshack.us/img709/5716/uponresize.png

Ответы [ 4 ]

1 голос
/ 20 декабря 2009

Есть несколько проблем с кодом.

В дополнение к другим предложениям использования pack () или установки размера фрейма «после» добавления компонентов в фрейм и непосредственно перед вызовом метода setVisible (true), вам нужно взглянуть на следующее.

Код основан на старых методах рисования AWT, которые НЕ должны использоваться с Swing. Вы НИКОГДА не должны переопределять методы update () или paint () JFrame. Причина, по которой дочерние компоненты не окрашены, заключается в том, что метод paint () отвечает за их отображение, но вы переопределяете это поведение по умолчанию.

Когда пользовательское рисование Swing выполняется путем переопределения метода paintComponent () JComponent или JPanel, этот компонент добавляется на панель содержимого фрейма. Прочитайте раздел из учебника Swing по Custom Painting для получения дополнительной информации и рабочих примеров. Одним из ключевых моментов в учебнике является предоставление предпочтительного размера для компонента, чтобы он мог быть правильно размечен менеджером макета.

Вы НЕ должны использовать KeyListener. Опять же, это старая техника AWT. Swing теперь использует привязки клавиш для сопоставления KeyStrokes с действием. Для получения дополнительной информации прочитайте раздел из руководства Swing «Как использовать привязки клавиш».

Вы НЕ должны использовать WindowListener для повторного закрытия кадра, это старая техника AWT. Приложения Swing теперь используют метод frame.setDefaultCloseOperation (...) для управления этим.

В разделе «Как использовать значки» вы найдете более простые способы загрузки изображения.

Итак, в общем, я предложил вам начать с загрузки учебного пособия по Swing, чтобы изучить приемы программирования на Swing. Учебное пособие охватывает основы и множество простых примеров, с которых можно начать.

1 голос
/ 20 декабря 2009

не видя ваш код, вам почти невозможно помочь:

звучит так, как будто вы пропускаете вызов pack в вашем Window / JFrame, что заставляет окно вычислять его размер на основе его содержимого

и ваши компоненты пользовательского интерфейса (флажок + текстовые поля), вероятно, не отображаются, потому что вы не добавили их правильно, например, через панель содержимого и менеджер макетов .

просто предположение!

0 голосов
/ 20 декабря 2009

setSize() следует переместить после initComponents()

Но опять же, вам не нужно переносить код, вы можете без труда редактировать исходный код в Netbeans, просто держите initComponents в сложенном виде.

0 голосов
/ 20 декабря 2009

Я полагаю, вы звоните ...

.setSize(500,500);

в главном окне?

если вы знаете размер изображения, то я бы лично позвонил ...

.setPreferedSize(x,x);
.setMinimenSize(x,x);
.setSize(x,x);
.pack();

в главном окне / панели.

Вы можете разместить свой код?

...