Компоненты не отображаются в апплете, пока я не изменю размер - PullRequest
2 голосов
/ 06 января 2012

Я посмотрел другие примеры здесь, но revalidate () или repaint () после создания всех моих компонентов.Я также попробовал this.setVisible (this);и это не сработало.Я попытался создать свои компоненты в методе createGUI () и запустить его из метода init () в инструкции try / catch.

РЕДАКТИРОВАТЬ Я испробовал все ваши примеры, как вы можете видеть в комментариях.Но из того, что все сказали, почему это сейчас работает?

package basic;

import java.awt.*;
//import java.applet.*;
import java.applet.Applet;
import javax.swing.*;
import java.awt.event.*;

public class Shapes extends Applet implements ActionListener
{
JButton rectBtn = new JButton("Rectangle");
JButton circBtn = new JButton("Circle");
JLabel rectLbl = new JLabel("Rectangle"), circLbl = new JLabel("Circle");
JLabel widthLbl = new JLabel("Width"), heightLbl = new JLabel("Height");
JTextField widthTF = new JTextField(6), heightTF = new JTextField(6), colorTF;

boolean rectOn;
boolean circOn;
int x,y, width, height;
String xcord, ycord, widthSize, heightSize;

public void init()
{   

    JPanel TotalGUI = new JPanel(new GridLayout(2,0));
    TotalGUI.add(rectLbl);      TotalGUI.add(rectBtn);
        rectBtn.addActionListener(this);
    TotalGUI.add(circLbl);      TotalGUI.add(circBtn);
        circBtn.addActionListener(this);
    TotalGUI.add(widthLbl);     TotalGUI.add(widthTF);
    TotalGUI.add(heightLbl);    TotalGUI.add(heightTF);
    add(TotalGUI, BorderLayout.WEST);
    //this.setVisible(true);
    TotalGUI.repaint();
    //pack();
}


//@Override
public void paintComponent(Graphics g)
{
    //super.paintComponent(g);
    //Graphics g2 = getGraphics();

    if(rectOn)//if Rectangle has been pressed
    {
        g.drawRect(x,y, width,height);
    }
    if(circOn)//if Circle has been pressed
    {
        g.drawOval(x,y, width, height);
    }
}

public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == rectBtn)
    {
        rectOn = true;
    }
    if(e.getSource() == circBtn)
    {
        circOn = true;
    }
    //Reads coordinates and sizes as Strings and converts to integers
    try{
        widthSize = widthTF.getText();
        width = Integer.parseInt(widthSize);    
        heightSize = heightTF.getText();
        height = Integer.parseInt(heightSize);
    }
    catch(Exception err)    { JOptionPane.showMessageDialog(null, "Enter a number!");   }
    repaint();
}

}

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Основная проблема с исходным кодом заключалась в том, что вы переопределили метод paint (), не вызывая super.paint (g). Когда вы изменили этот метод на paintComponent (), код работал, потому что этот метод даже не завершился в апплете, поэтому он был мертвым кодом.

Проблемы с вашим кодом:

  1. Вы должны расширять JApplet для апплета Swing
  2. Вы НЕ должны переопределять метод paint () (или paintComponent ()) апплета. Если вам нужно выполнить пользовательское рисование, тогда вы переопределяете метод paintComponent () JPanel (или JComponent) и добавляете панель на панель содержимого апплета.
  3. Код должен быть выполнен на EDT.
  4. Апплет отобразит компоненты автоматически, нет необходимости вызывать перерисовку)
  5. Никогда не используйте getGraphics () для создания пользовательских рисунков. Используйте объект Graphics метода paintComponent ().
  6. Когда вы пытаетесь переопределить метод, не забудьте использовать аннотацию @Override перед сигнатурой метода, чтобы убедиться, что вы корректно переопределяете метод.

Начните с чтения Swing tutorial для лучшего объяснения и рабочего примера. Начните с разделов:

  1. Как сделать апплеты
  2. Выполнение нестандартной живописи
1 голос
/ 06 января 2012

Вы должны вызвать repaint () для TotalGUI.

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

Тем не менее, предпочтительным подходом является использование в методе рисования totalGUI методов рисования (Graphics g) / paintComponent (Graphics g):

super.paintComponent(g);

как описано в этих сообщениях:

JPanel перекрасить вопрос

http://www.sitepoint.com/forums/showthread.php?273522-super.paintComponent()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...