2013-12-23 2 views
2

Я пытался настроить этот макет границы в течение нескольких часов. Я искал How to Use BorderLayout на веб-сайте Java, но я до сих пор не получил его.Пограничный макет не работает

Я включил свой код ниже для обзора и упростил, как я пытаюсь использовать функцию BorderLayout.

Как настроить макет границы на JL3?

class GameStructure { 
    private String []wordList = {"computer","java","activity","alaska","appearance","article", 
      "automobile","basket","birthday","canada","central","character","chicken","chosen", 
      "cutting","daily","darkness","diagram","disappear","driving","effort","establish","exact", 
      "establishment","fifteen","football","foreign","frequently","frighten","function","gradually", 
      "hurried","identity","importance","impossible","invented","italian","journey","lincoln", 
      "london","massage","minerals","outer","paint","particles","personal","physical","progress", 
      "quarter","recognise","replace","rhythm","situation","slightly","steady","stepped", 
      "strike","successful","sudden","terrible","traffic","unusual","volume","yesterday"}; 
    private JTextField tf; 
    private JLabel jl2; 

    public void window() { 
     ImageIcon ic = new ImageIcon("hangman.png"); 
     JFrame gameFrame = new JFrame(); 
     JPanel jp = new JPanel(); 
     JPanel jpLets = new JPanel(); 
     JPanel jpBlank = new JPanel(); 
     JPanel imgPane = new JPanel(); 
     JPanel panel1 = new JPanel(); 
     JPanel panel2 = new JPanel(); 
     panel2.setLayout(new BorderLayout()); 
     jpLets.setLayout(new BoxLayout(jpLets, BoxLayout.Y_AXIS)); 
     panel1.setLayout(new BorderLayout()); 
     panel1.setOpaque(false);//!! 
     //jp.setBorder(BorderFactory.createTitledBorder("")); 
     tf = new JTextField(1); 
     JLabel img = new JLabel(ic, JLabel.CENTER); 
     JLabel jl = new JLabel("Enter a letter", JLabel.CENTER); 
     jl2 = new JLabel("Letters used: ", JLabel.CENTER); 
     JLabel jl3 = new JLabel("__ ", JLabel.CENTER); 
     jl.setFont(new Font("Rockwell", Font.PLAIN, 20)); 
     tf.setFont(new Font("Rockwell", Font.PLAIN, 20)); 
     jl2.setFont(new Font("Rockwell", Font.PLAIN, 20)); 
     imgPane.add(img, BorderLayout.CENTER); 
     jp.add(jl); 
     jp.add(tf); 
     jpLets.add(jl2); 
     jpBlank.add(jl3); 
     //jpMain.add(imgPane, BorderLayout.CENTER); 
     panel1.add(jp, BorderLayout.NORTH); 
     panel1.add(jpLets, BorderLayout.SOUTH); 
     panel1.add(imgPane); 
     panel2.add(panel1, BorderLayout.CENTER); 
     panel2.add(jpBlank, BorderLayout.PAGE_END); 
     gameFrame.setTitle("Hangman"); 
     gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     gameFrame.setIconImage(
     new ImageIcon("Hangman-Game-grey.png").getImage()); 
     gameFrame.setResizable(false); 
     gameFrame.add(panel2); 
     gameFrame.setSize(600, 600); 
     gameFrame.setLocationRelativeTo(null); 
     gameFrame.setVisible(true); 

      int j = 0; 
      int []length = new int[64]; 
      for(j = 0; j<64; j++) { 
      length[j] = wordList[j].length();//gets length of words in wordList 
      }//end for 
      int l = 0; 
      String line = ""; 
      //create line first then put into .setText 
      for(int m = 0; m<length[l]; m++) { 
       line += "__ "; 
       l++; 
      }//end for 
      jl3.setText(line); 

      tf.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) {//when enter key pressed 
       JTextField tf = (JTextField)e.getSource(); 
       String letter = tf.getText(); 
       jl2.setText(jl2.getText() + letter + " ");//sets jlabel text to users entered letter 
       }//end actionPerformed method 
      }); 
     }//end userInput method 
    } 

public class GameMain { 
    public static void main(String[] args) { 
     GameStructure game = new GameStructure(); 
     game.window(); 
    } 
} 
+0

В чем проблема/вопрос? – Reimeus

+0

Как настроить макет границы на jp2 – Anon

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). В стороне это выглядит очень знакомо. Вы удаляете старые вопросы? –

ответ

2

Прежде всего, позвольте мне выразить признательность вам на самом деле, глядя на этом уроке я связывал вас вчера и прикладывая усилие в обучении :)

Вот пара вещей, которые я вижу.

Здесь вы пытаетесь использовать BorderLayout для JLabel. Обычно вы хотите использовать LayoutManagers с контейнерами (JPanels, JFrames, JDialogs, JApplets). Избавьтесь от кода ниже.

JLabel img = new JLabel(ic, JLabel.CENTER); 
img.setLayout(new BorderLayout()); 

Также здесь, со всеми вашими jp.add().

jp.add(img, BorderLayout.CENTER); 
jp.add(jl); 
jp.add(tf); 
jp.add(jl2); 
.... 

Я предполагаю, что вы хотите использовать BorderLayout, но не было BorderLayout указано для jp панели. По умолчанию, если вы не укажете LayoutManager, JPanel даст вам FlowLayout

JPanel jp = new JPanel(); 

Имейте в виду, когда вы назначаете BorderLayout в контейнер, вы хотите, чтобы убедиться, что каждый компонент, добавить к нему, имеет заданную позицию макета. Ни одна позиция не должна использоваться более одного раза. Кроме того, всегда следует использовать BorderLayout.CENTER. (например, если у вас есть только два компонента на панели, используйте BorderLayout.SOUTH, BorderLayout.CENTER).

Кроме того, вы должны научиться размещать макет с несколькими панелями, чтобы получить желаемый результат. Вот простой пример. Скажем, у вас есть две кнопки и изображения этикетки

JLabel label = new JLabel(new ImageIcon(filePath)); 
JButton jbt1 = new JButton("jbt1"); 
JButton jbt2 = new JButton("jbt2"); 

Я хочу, чтобы макет выглядеть следующим образом

+--------------------------------+ 
|        | 
|        | 
|   Image Label   | 
|        | 
+----------------+---------------+ 
|  jbt1  |  jbt2  | 
+----------------+---------------+ 

Первое, что я хочу сделать, это добавить кнопки в отдельный JPanel.Затем заверните этикетку в JPanel (не обязательно, но мне нравится использовать панели);

JPanel buttonsPanel = new JPanel();  <-- FlowLayout (none specified) 
buttonsPanel.add(jbt1); 
buttonsPanel.add(jbt2); 

JPanel labelPanel = new JPanle();  <-- FlowLayout 
labelPabel.add(label); 

Тогда я собираюсь обернуть две панели с другой панелью с BorderLayout

JPanel panel1 = new JPanel(new BorderLayout()); 
panel1.add(buttonPanel, BorderLayout.SOUTH); 
panel1.add(labelPanel, BorderLayout.CENTER); 

Так моя последняя панель будет выглядеть следующим образом

  panel1 
+--------------------------------+ 
|        | 
|        | BorderLayout.CENTER 
|   Image Label   | 
|        | 
+----------------+---------------+ 
|  jbt1  |  jbt2  | BorderLayout.SOUTH 
+----------------+---------------+ 

Допустим, вы пришли с другой панелью, которую вы хотели добавить. Вы хотите добавить эту новую панель слева от панели, которую мы только что создали. Мы только теперь нужно использовать panel1 панель, которую мы создали и завернуть эту панель и новую панель в другой панели

JPanel newPanel = new JPanel(); 

JPanel panel2 new JPanel(new BorderLayout()); 
panel2.add(newPanel, BorderLayout.WEST); 
panel2.add(panel1, BorderLayout.CENTER); 

      panel2 
+---------------+--------------------------------+ 
|    |        | 
|    |        | 
|    |   Image Label   | 
| newPanel |        | 
|    +----------------+---------------+ 
|    |  jbt1  |  jbt2  | 
+---------------+----------------+---------------+ 

Смотрите, как расположение и панели были. Это отличный способ справиться с компоновкой компонентов.

+0

. Небольшое дополнение: 'BorderLayout.CENTER' является контейнером большого мальчика в макете. AKA, если у вас есть два объекта в CENTER и SOUTH, объект в центре будет расширяться, чтобы заполнить любое дополнительное пространство, а не наоборот. Хорошее упражнение, чтобы увидеть, как работают макеты, - создать базовый фрейм и целую кучу панелей с разными цветами фона. (Таким образом, вы можете видеть, что они отличаются друг от друга.) Затем вы можете делать такие вещи, как переустройство панелей с различными типами менеджеров макетов и посмотреть, что произойдет. –

+0

Я пытался настроить его, как вы сказали, но не повезло :(Я обновил код выше. – Anon

+0

@ Не похоже, что вы добавили 'jpMain' в' gameFrame' –

0

Вы не добавляете jp в gameFrame или jp2. В любом случае вы добавляете много компонентов на панель jp, которая не устанавливается как BorderLayout (поэтому по умолчанию она установлена ​​в FlowLayout), а затем вы просто добавляете ее в jp2, который установлен в BorderLayout, но имеет только два компонента ,

Итак, попробуйте добавить следующую строку между этими двумя (существующих) линий:

gameFrame.setResizable(false); 
gameFrame.add(jp); 
gameFrame.pack(); 
+0

Не могли бы вы прояснить ситуацию. – Anon

+0

@ На основе кода, который вы указали (который не является полным кодом), я следил за информацией, которую вы дали :) Если вы следуете коду, вы видите, что вы создаете JFrame прямо в begginig, но вы не добавили панели к кадру, только переменная img – prmottajr

+0

Я обновил код, теперь он завершен. – Anon

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