java - 边框布局不起作用

标签 java jpanel jlabel jtextfield border-layout

我已经尝试设置这个边框布局几个小时了。我查了一下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();
   }
}

最佳答案

首先,让我赞扬您实际查看了我昨天链接给您的教程并努力学习:)

这是我看到的一些事情。

在这里,您尝试将 BorderLayout 用于 JLabel。通常,您希望将 LayoutManager 与容器(JPanel、JFrame、JDialog、JApplet)一起使用。删除下面的代码。

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,但没有为 jp 面板指定 BorderLayout。默认情况下,如果你不指定LayoutManager,JPanel会给你一个FlowLayout

JPanel jp = new JPanel();

请记住,当您将 BorderLayout 分配给容器时,您需要确保添加到其中的每个组件都指定了布局位置。任何位置不得使用多次。此外,通常应始终使用 BorderLayout.CENTER。 (例如,如果面板中只有两个组件,请使用 BorderLayout.SOUTHBorderLayout.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     |   
+---------------+----------------+---------------+

看看布局和面板如何。这是处理组件布局的好方法

关于java - 边框布局不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20735601/

相关文章:

java - 确保通用 lambda 表达式的类型安全

java - 在同一个 JFrame 中使用多个类

java - 在 jlabel 背景上添加 jpanel

java - 如何获取JLabel[ ] [ ]中鼠标点击的标签索引?

java - 标签和面板透明度问题

java - 不使用 peek() 从堆栈中删除元素

java - Delphi XE5 - Android - 在服务器窗口中保存文件(共享文件夹)

java - 错误 : package org. apache.commons.collections15 不存在

java - 是否可以指向特定的 JPanel

java - mouseMoved 方法中的碰撞检测