Я не вижу свою JPanel и ее компоненты в JApplet - PullRequest
0 голосов
/ 13 июля 2011

Я хочу поместить JPanel в JApplet, проблема в том, что я его не вижу :( Я переопределил paintComponent моего JPanel, чтобы получить фоновое изображение,но я ничего не вижу. Когда я удаляю метод paintComponenet, который я переопределил, и устанавливаю цвет фона этой панели, кажется, что JPanel заполняет JApplet, и все же ни один компонент не виден:-S Я пробовал разные макеты. Я также поместил свою панель в центр другой панели, которая заполняет мой JApplet, но ничего не изменилось, и все еще ни один компонент и фоновое изображение не видно: (

import java.awt.BorderLayout;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class Main extends JApplet implements Runnable{

private JTextArea display;
private Thread outputThread;
JPanel boardPanel;

private ClientViewManager view;

@Override
public void init() {

    try {
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    } catch (Exception e) {
        System.err.println("createGUI didn't successfully complete");
    }

}

private void createGUI() {

    display = new JTextArea(4, 30);
    display.setEditable(false);
    getContentPane().add(new JScrollPane(display), BorderLayout.SOUTH);

    setFocusable(true);
    setVisible(true);
    setName("CE Tanks");
    setSize(600, 600);
    setLocation(100, 100);

    boardPanel = new JPanel();
    boardPanel.setLayout(null);
    boardPanel.setBackground(new java.awt.Color(128, 255, 255));
    getContentPane().add(boardPanel, BorderLayout.CENTER);

}

public void start() {
    outputThread = new Thread(this);
    outputThread.start();
}

public void run() {
                view = new ClientViewManager();
                boardPanel.add(view);
                boardPanel.repaint();
                repaint();
    }
}


 class ClientViewManager extends JPanel {
private int rows=8;
private int columns=8;

public ClientViewManager() {
    super(null);

    JLabel lb= new JLabel("lb.jpg");
    lb.setLocation(10, 10);
    lb.setSize(50, 50);
    lb.setOpaque(false);
    lb.setVisible(true);

    this.add(lb);
}

public void paintComponent(Graphics g) {

    g.drawImage(new ImageIcon("ground.jpg").getImage(), 0, 0, columns * 50,
            rows * 50, this);
}

}

Код выше можно скомпилировать. Я даже не могу добавить Keylistener ни к своему JPanel, ни к своему JApplet. Я использовал java.awt.KeyEventDispatcher, а в dispatchKeyEvent(KeyEvent e) я что-то печатал в консоли, но это было напечатано 3 раза.: (

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Я переопределил paintComponent моего порядка JPanel, чтобы иметь фоновое изображение,

Но вы не добавили пользовательский компонент в свой апплет:

//boardPanel = new JPanel();
boardPanel = new ClientViewManager();

Также:

  1. избавиться от setVisible ().Это не требуется для любого из элементов управления в вашей программе.По умолчанию все компоненты, кроме Контейнера верхнего уровня (Jframe, JDialog и т. Д.), Уже видны.В случае JApplet вам не нужно делать его видимым, так как это является частью процесса отображения апплета.
  2. избавьтесь от setSize () и setLocation (), вы не можете контролировать положениеэтого апплета.
  3. Не читайте файл изображения в методе paintComponent ().Это неэффективно, так как этот метод вызывается всякий раз, когда Swing определяет, что компонент должен быть перекрашен.
  4. JLabels по умолчанию непрозрачны, поэтому нет необходимости вызывать метод setOpaque.
  5. При выполнении пользовательскихРисование. Вы также должны переопределить метод getPreferredSize () компонента, чтобы получить правильный размер пользовательского рисования, чтобы менеджеры по макету могли использовать эту информацию.В этом случае это работает, потому что вы добавили панель в ЦЕНТР BorderLayout.Попробуйте добавить панель к СЕВЕРУ, чтобы увидеть, что происходит.

Редактировать:

Теперь я вижу, куда вы добавляете ClientViewManager.Я не уверен, почему вы пытаетесь сделать это с потоком, но еще раз есть несколько проблем.

  1. Когда вы добавляете / удаляете компоненты из видимого графического интерфейса, тогда основной код:

    panel.add (...);
    panel.revalidate ();
    panel.repaint ();

  2. Однако это все равно не сработает, поскольку вы используете нулевой макет, а размер панели равен 0. Используйте надлежащий менеджер макета и реализуйте метод getPreferredSize (), как указано выше.и компонент будет отображаться правильно.

0 голосов
/ 13 июля 2011

Я рекомендую вам использовать GUI Builder для Netbeans для создания подобного GUI, а затем сравнить сгенерированный код с вашим кодом. Результаты NetBeans действительно полезны для создания кода свинга.

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