2014-12-21 9 views
0

Я пытаюсь закодировать простой понг, и у меня есть панель фона, содержащая панель. Так что, конечно, мне нужно иметь возможность расположить планку по размеру и перемещать по вертикали по запросу. Теперь я просто пытаюсь поставить его в исходное положение. Если я не отключу макет, панель будет помещена в верхний центр независимо от настройки местоположения, но если я отключу макет и задаю местоположение, он просто не появится. Я не уверен, чего не хватает. Вот фрагмент кода, если это может иметь значение:Размещение JPanel в JPanel

public PongPanel() { 
    setLayout(null); 
    setPreferredSize(SIZE); 
    setBackground(Color.BLACK); 
    player_one_bar = new Bar(); 
    add(player_one_bar); 
    player_one_bar.setLocation(10, getSize().height/2-3); 
} 

ответ

3

Если вы установите менеджер компоновки утратившим вам придется указать точные координаты панели, а это означает что-то вроде -

setBounds(10, 10, 20, 100); 

Положите панель в место (10,10) с шириной 20 и высотой 100.

+3

* "поставит панель на место (10,10) с шириной 20 и высотой 100 .." * ..и создать следующий 3 ошибок в этом процессе. Java GUI должны работать с разными ОС, размером экрана, разрешением экрана и т. Д. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

+0

Я согласен с Эндрю, это «последний вариант». Вы можете установить размеры относительно ширины и высоты экрана, но у вас могут возникнуть проблемы при перемещении между различными размерами экрана. –

+1

* «Я согласен с Эндрю, это« последнее средство ».« Нет, последнее средство »- это менеджер макетов, который по-прежнему уважает предпочтительный, самый маленький и самый большой размер дочерних компонентов. См. ['setLayout (null)' is * never * необходимо. ** Всегда! **] (https://community.oracle.com/thread/1353374?tstart=0) на форумах Oracle. Это было начато по-настоящему, и ни один аргумент не смог повлиять на меня, чтобы думать иначе. –

3

Если «бар» вы имеете в виду игру «Понг» paddle, то это не должно быть компонент вообще, который представляет собой позицию, которая визуально представлен спрайтом, который нарисован в методе paintComponent JPanel.

Например:

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class PongPaddle extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 500; 
    private static final int RECT_X = 20; 
    private static final int RECT_W = 10; 
    private static final int RECT_H = 60; 
    private static final int STARTING_Y = (PREF_H - RECT_H)/2; 
    private static final int TIMER_DELAY = 15; 
    private static final int DELTA_PADDLE = 3; 
    private boolean paddle1GoingDown = true; 
    private boolean paddle2GoingDown = false; 
    private Rectangle paddle1 = new Rectangle(RECT_X, STARTING_Y, RECT_W, RECT_H); 
    private Rectangle paddle2 = new Rectangle(PREF_W - RECT_X - RECT_W, 
     STARTING_Y, RECT_W, RECT_H); 

    public PongPaddle() { 
     setBackground(Color.black); 
     new Timer(TIMER_DELAY, new TimerListener()).start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class TimerListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     int deltaPaddle1 = paddle1GoingDown ? 1 : -1; 
     deltaPaddle1 *= DELTA_PADDLE; 

     int x = paddle1.getLocation().x; 
     int y = paddle1.getLocation().y + deltaPaddle1; 

     if (y + RECT_H >= PREF_H) { 
      paddle1GoingDown = false; 
     } 
     if (y <= 0) { 
      paddle1GoingDown = true; 
     }   
     paddle1.setLocation(x, y); 

     int deltaPaddle2 = paddle2GoingDown ? 1 : -1; 
     deltaPaddle2 *= DELTA_PADDLE; 

     x = paddle2.getLocation().x; 
     y = paddle2.getLocation().y + deltaPaddle2; 

     if (y + RECT_H >= PREF_H) { 
      paddle2GoingDown = false; 
     } 
     if (y <= 0) { 
      paddle2GoingDown = true; 
     }   
     paddle2.setLocation(x, y); 

     repaint(); 

     if (!PongPaddle.this.isShowing()) { 
      ((Timer) e.getSource()).stop(); 
     } 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(Color.white); 
     if (paddle1 != null) { 
     g2.fill(paddle1); 
     } 
     if (paddle2 != null) { 
     g2.fill(paddle2); 
     } 
    } 

    private static void createAndShowGui() { 
     PongPaddle mainPanel = new PongPaddle(); 

     JFrame frame = new JFrame("PongPaddle"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

К сожалению, это то, что я имел в виду :) Я не знал точного имени, поэтому поставил там местозаполнитель. Благодаря! – Snowflake

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