java - 如何使用 java swing 创建捕捉组件?

标签 java swing user-interface

我已经努力在 swing 中编写 GUI,但我正在努力进一步改进它,因为我觉得它看起来仍然有点不对劲。

我希望:

  • 捕捉到右上角的按钮,
  • 文本字段与按钮高度相同,并从左上角延伸到按钮边缘
  • 即使在拉伸(stretch)时,滚动 Pane 也会从文本字段和按钮的底部拉伸(stretch)到窗口的边缘。

我不确定如何将组件分别“捕捉”到该区域的右上角、左上角和其余区域。

    @SuppressWarnings("serial")
    class TFrame extends JFrame
    {
      TFrame()
      {
        super("Huffman Compression");//setTitle
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setResizable(true);

        jPanel = new JPanel();

        jTextField = new JTextField("Enter string to compress...");

        jButton = new JButton("Compress");
        jButton.setFocusable(false);

        jTextArea = new JTextArea("LOG AREA", 30, 30);
        jTextArea.setWrapStyleWord(true);
        jTextArea.setLineWrap(true);
        jTextArea.setEditable(false);
        jTextArea.setFocusable(false);
        jTextArea.setOpaque(false);

        jScrollPane = new JScrollPane(jTextArea);
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        jPanel.add(jTextField, BorderLayout.WEST);
        jPanel.add(jButton, BorderLayout.EAST);
        jPanel.add(jScrollPane, BorderLayout.SOUTH);

        add(jPanel);

        try
        {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException
               | InstantiationException
               | IllegalAccessException
               | UnsupportedLookAndFeelException e)
        {
          e.printStackTrace();
        }

        setVisible(true);
      }

      private JPanel jPanel;
      private JTextField jTextField;
      private JButton jButton;
      private JTextArea jTextArea;
      private JScrollPane jScrollPane;

    }

    public static void main(String[] args)
        {

          TFrame frame = new TFrame();

        frame.pack();
        ...

这是目前的样子: /image/l4q5Z.png

问候。

最佳答案

基本上,您需要利用一系列布局管理器(通常称为“复合布局”)。

例如,您可以使用 GridBagLayout 来完成按钮和字段的要求,并使用 BorderLayout 来完成其余部分,例如...

Log Window

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BrowserWindow {

    public static void main(String[] args) {
        new BrowserWindow();
    }

    public BrowserWindow() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JPanel topPane = new JPanel(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.weightx = 1;
                gbc.fill = GridBagConstraints.BOTH;
                topPane.add(new JTextField(10), gbc);
                gbc.weightx = 0;
                gbc.fill = GridBagConstraints.NONE;
                gbc.gridx++;
                topPane.add(new JButton("Compress"), gbc);

                JTextArea ta = new JTextArea("Log...", 30, 30);
                JScrollPane sp = new JScrollPane(ta);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(topPane, BorderLayout.NORTH);
                frame.add(sp);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

看看Laying Out Components Within a Container了解更多详情

关于java - 如何使用 java swing 创建捕捉组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19826179/

相关文章:

java 两个线程操作同一个数组

支持节点大小的Java/JavaScript图形布局库

java - 用 Java 截取网页的屏幕截图

java - 如何在 java 运行时将 jpanel 表单添加到 jpanel?

java - 如何阻止在货币之前生成?

java - Android - Fragment 未替换

user-interface - 最佳用户界面,用于搜索/过滤/ bool 表达式

java - 按字母顺序从文本文件中排序数组然后输出到另一个文件java

c++ - 如何为 wxWidgets wxBitmapButton 添加标签?

java - 自动更新JTable