【问题标题】:Positioning a button on a JPanel在 JPanel 上定位按钮
【发布时间】:2015-01-26 13:58:35
【问题描述】:

我正在尝试将三个按钮设置在此 JPanel 的中间,该按钮设置在另一个面板上方。

一切正常,但无论如何,三个按钮都保持在同一位置。

如何移动panel2 中心的三个按钮?现在这三个按钮位于panel2 的中心左侧。

我的面板代码在这里:

public AbcGeniusPanel()
 {
   //this.setVisible(false);
   ImageIcon[] alphabets = new ImageIcon[26];
   ImageIcon[] images = new ImageIcon[26];
   setBackground(Color.yellow);

   //Load the images for alphabet images into the alphabets array using a for loop 
  for(int i = 0; i < alphabets.length; i++)
    {
    alphabets[i] = new ImageIcon("C:\\Users\\Dip\\Desktop\\Java Projects\\AbcGeniusApp\\src\\Alphabets\\"+(i+1)+".png");
    }

  //Load the images images in the IMageIcon array
  for(int i = 0; i < images.length; i++)
    {
    images[i] = new ImageIcon("C:\\Users\\Dip\\Desktop\\Java Projects\\AbcGeniusApp\\src\\Images\\"+(i+1)+".png");
    }

    //Create two JPanel objects
    JPanel panel = new JPanel();
    JPanel panel2 = new JPanel();
   //Set a layoutManager on the panel

    panel.setLayout(new GridLayout(2, 13, 5, 5)); //This is good for now

    //Create an array for holdoing the buttons
    buttons = new JButton[26];

    /
    //Try passing Images inside the JButton parameter later.
    for(int i = 0; i < 26; i++)
    {
    buttons[i] = new JButton(alphabets[i]);
    }

    setLayout(new BorderLayout(2,0));
    panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS));
    //add the panel to the Border layout
    add(panel,BorderLayout.SOUTH);
    add(panel2);

    //Add evenHandling mechanism to all the buttons
     for(int k = 0; k<26; k++)
     {
      buttons[k].addActionListener(this);
     }
    for(int count1 = 0; count1<26; count1++)
    {
     panel.add(buttons[count1]);
    }

    JButton button1 = new JButton();
    JButton button2 = new JButton();
    JButton button3 = new JButton();

    panel2.add(button1);
    panel2.add(button2); 
    panel2.add(button3);
     }

【问题讨论】:

  • 1) 源代码中的一个空白行是永远需要的。 { 之后或} 之前的空行通常也是多余的。 2) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • 我对Center left 的真正含义感到困惑。是中心还是左边?无论如何,使用具有适当对齐方式的简单 FlowLayout 应该会给您预期的布局
  • 这里是输出tinypic.com/r/1z4ki2b/8 的链接,按钮位于左侧,无法移动。但无论如何,谢谢,我会尝试不同对齐方式的 Flowlayout。

标签: swing jpanel awt layout-manager boxlayout


【解决方案1】:

您可以使用 BoxLayout(使用 Box.createHorizo​​ntalBox() 可能更容易),但您必须在框的每一端放置垂直胶水。您可能还想在按钮之间放置水平支柱以给它们一些间距。

为您的按钮使用 FlowLayout 会更容易,这相当于我所说的,没有额外的代码。布局可能存在潜在缺陷,导致按钮或 2 流到下一行,但对于您的简单应用程序,这种可能性可能不大。

这里有两个例子。注释掉一行并在 (???) 另一行中注释以查看按钮的不同方法:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class AlphabetExample {

   public static void main(String[] args) {
      AlphabetExample alphabetExample = new AlphabetExample();
      JFrame frame = alphabetExample.createGui();
      frame.setVisible(true);
   }

   private JFrame createGui() {
      JFrame frame = new JFrame("Letters!");
      frame.setSize(400, 300);

      Container contentPane = frame.getContentPane();
      contentPane.add(setupLetters(), BorderLayout.CENTER);
//      contentPane.add(setupButtonsWithBox(), BorderLayout.NORTH); // <-- with a BoxLayout
      contentPane.add(setupButtonsWithFlowPane(), BorderLayout.NORTH); // <-- with a FlowLayout

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      return frame;
   }

   private JPanel setupLetters() {
      String  letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

      JPanel lettersPanel = new JPanel(new GridLayout(2, 13, 5, 5));

      for (char x : letters.toCharArray()) {
         final String letter = String.valueOf(x);
         JButton button = new JButton(letter);
         button.setActionCommand(letter);
         lettersPanel.add(button);
      }

      return lettersPanel;
   }

   private JComponent setupButtonsWithBox() {
      Box b = Box.createHorizontalBox();
      b.add(Box.createHorizontalGlue());
      b.add(new JButton("Left Button"));
      b.add(Box.createHorizontalStrut(5));
      b.add(new JButton("Center Button"));
      b.add(Box.createHorizontalStrut(5));
      b.add(new JButton("Right Button"));
      b.add(Box.createHorizontalGlue());
      return b;
   }

   private JComponent setupButtonsWithFlowPane() {
      JPanel panel = new JPanel(); // default layout manager is FlowLayout
      panel.add(new JButton("Left Button"));
      panel.add(new JButton("Center Button"));
      panel.add(new JButton("Right Button"));

      return panel;
   }
}

【讨论】:

    【解决方案2】:

    这解决了我的问题

         for(int count1 = 0; count1<3; count1++)
        {
         panel2.add(Box.createHorizontalGlue());
         panel2.add(imageButtons[count1]);
         panel2.add(Box.createHorizontalGlue());   
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多