Java 面板对齐

标签 java swing jframe jpanel alignment

class CipherGUIFrame extends JFrame {
  public CipherGUIFrame() {
    super("Caesar Cipher GUI");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 600);

    JTextArea area1 = new JTextArea();
    JTextArea area2 = new JTextArea();
    JSpinner myspinner=new JSpinner();
    JPanel mainframe = new JPanel();
    mainframe.setLayout(new BoxLayout(mainframe, BoxLayout.Y_AXIS));
    JPanel p1 = new JPanel();
    JPanel p2 = new JPanel();
    JPanel p3 = new JPanel();
    p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
    p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
    p1.setBorder(BorderFactory.createTitledBorder("Cleartext"));
    p2.setBorder(BorderFactory.createTitledBorder("Spinner"));
    p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
    p3.setBorder(BorderFactory.createTitledBorder("Ciphertext"));
    p1.add(area1);
    p2.add(myspinner);
    p3.add(area2);
    mainframe.add(p1);
    mainframe.add(p2);
    mainframe.add(p3);
    this.add(mainframe);
  }
}

这段代码似乎生成了类似于以下内容的内容: http://i.imgur.com/ZIUdrBP.jpg

我正在尝试整理它,使其看起来更干净;有没有办法缩小中间面板或使其他面板更大以使其看起来更好?

最佳答案

不要设置任何内容的大小,而是设置 JTextArea 的列和行。当您不想要 BoxLayout 的行为时,请勿使用它。将 JTextAreas 放入 JScrollPanes 中。并且不要忘记 pack() 你的 JFrame。

import java.awt.BorderLayout;
import javax.swing.*;

public class Cipher2 extends JPanel {
   public static final int ROWS = 12;
   public static final int COLS = 30;

   private JTextArea textArea1 = new JTextArea(ROWS, COLS);
   private JTextArea textArea2 = new JTextArea(ROWS, COLS);

   public Cipher2() {
      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));  // Box OK here

      JScrollPane scroll1 = new JScrollPane(textArea1);
      add(wrapComponentWithTitle(scroll1, "Fubar"), BorderLayout.PAGE_START);

      add(wrapComponentWithTitle(new JSpinner(), "Spinner"), BorderLayout.CENTER);

      scroll1 = new JScrollPane(textArea2);
      add(wrapComponentWithTitle(scroll1, "Snafu"), BorderLayout.PAGE_END);
   }

   private JPanel wrapComponentWithTitle(JComponent component, String title) {
      // BoxLayout NOT OK here. Use BorderLayout instead
      JPanel wrapPanel = new JPanel(new BorderLayout());
      wrapPanel.add(component);
      wrapPanel.setBorder(BorderFactory.createTitledBorder(title));
      return wrapPanel;
   }

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

      JFrame frame = new JFrame("Foo");
      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();
         }
      });
   }
}

关于Java 面板对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26226895/

相关文章:

java - 按下按键时我的 JFrame 没有改变

java - 迭代 Map 时,Map 值被覆盖

java - 如何提高效率?

java - 伴随对象 Kotlin JNI 中的 UnsatisfiedLinkError

java - JLabel 在 GridBagLayout 内自动居中

java - 贪吃蛇游戏问题!!! java - swing - Jframe

java - 在 JFrame 上正确打包元素数组

java - 基于 TableCell 值的 JTable 行高亮器

java - 根据 JTable 中的第一列值为特定行着色?

java - JFrame DO_NOTHING_ON_CLOSE 不适用于 Command + Q