Качели? - PullRequest
       40

Качели?

2 голосов
/ 24 сентября 2011

У меня есть расширение JPanel под названием TPanel, которое рисует слово Tetris с правой стороны от JFrame. Метод curr() возвращает текущий кусок, который движется, и ограничен левой стороной (x <400) от <code>JFrame. Теперь по какой-то причине, когда я добавляю их обоих к JFrame, я вижу только второй, который я добавил, поэтому в основном он перекрывает другой. Я попробовал метод проверки, и он не работает.

Как мне показать их обоих одновременно?

Вот код:

public Tetris()
{
// frame stuff
super("Tetris");
this.setSize(616,636);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_O…

// components
occ = new boolean [30][20];
rnd = new Random();
info = new TPanel();
for(int i=0;i<occ.length;i++)
for(int j=0; j< occ[i].length;j++)
occ [i][j] = false;
pieces.add(initPiece());
this.getContentPane().add(info);
this.getContentPane().add(curr());



this.getContentPane().validate();
repaint();
this.addKeyListener(this);
run();
}

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011
  1. Фрагмент странного кода, не компилируемый (например, setDefaultCloseOperation(EXIT_O…)
  2. getContentPane() бесполезен в Java 5 и выше, удалите это
  3. Вы установили Focusдля TPanel
  4. Ищите KeyBindings вместо KeyListener, тогда ваши ключи будут работать правильно
  5. Добавьте KeyBinding к TPanel
  6. Я надеюсь, что у вас есть Icons для тетриса,
    • Поместите JLabels в панель TP *
    • JLabel.setIcon(myTetrisIcon)
  7. Ваш код может быть за пределами EDT, подробнее в "Concurency in Swing ", перенести вывод в графический интерфейс (код для Icon перерисовка) в invokeLater()
  8. Использовать только javax.swing.Timer для анимации
  9. Использовать revalidate() и repaint()
  10. Но если в Swing есть обычай рисовать, то проблема должна возникать откуда угодно
3 голосов
/ 24 сентября 2011
  1. Макет панели содержимого по умолчанию: BorderLayout
  2. Если компонент добавляется в BorderLayout без ограничений, он помещается в CENTER.
  3. Позиция CENTER может содержать только один компонент или контейнер.

Чтобы сразу понять, как исправить фрагмент кода, попробуйте изменить:

this.getContentPane().add(curr());

Кому:

this.getContentPane().add(curr(), BorderLayout.LINE_END);

Или еще лучше:

add(curr(), BorderLayout.LINE_END);
...