java - JFrame : How to make a simple layout with linebreak-like behavior?

标签 java swing layout demo

我尝试使用 Java 1.6 中的 Swing 创建一个包含 3 个元素的 JFrame:一个在页面的开头,第二个在同一行,左边有一些间距,第三个在新行。但是在几次尝试后都失败了:

BorderLayout.[SOUTH|WEST|EAST|NORTH]
BorderLayout.[LINE_START|LINE_END|AFTER_LINE_END|AFTER_LAST_LINE]
FlowLayout.LEFT
BoxLayout.[X_AXIS|Y_AXIS]

它显示正确的唯一方式是在使用时:

container.add(firstElement, BorderLayout.WEST);
container.add(secondElement, BorderLayout.EAST);
container.add(thirdElement, BorderLayout.SOUTH); 

这是我程序的当前版本:

import javax.swing.*;
import java.awt.*;
//import java.awt.event.*;
//import java.lang.reflect.*;

public class MainClass {
    public static void main(String[] args) {

        JFrame frame = new JFrame("JFrame Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container container = frame.getContentPane();

        JTextField field = new JTextField();
        JButton button = new JButton("Enter");
        JTextArea outputarea = new JTextArea("Outputtext before input.");
        outputarea.setEditable(false);

        container.add(field, BoxLayout.X_AXIS);
        container.add(button, BoxLayout.X_AXIS);
        container.add(outputarea, BoxLayout.Y_AXIS);

        field.setPreferredSize(new Dimension(600, 30));
        button.setPreferredSize(new Dimension(100, 30));
        //button.setMargin(new Insets(0, 10, 0, 0)); //left-margin
        outputarea.setPreferredSize(new Dimension(700, 300));

        container.setPreferredSize(new Dimension(800, 400));

        frame.pack();
        frame.setVisible(true);
    }
}

虽然我想实现这样的目标:
https://dl.dropboxusercontent.com/u/72032667/JFrame_Demo.html
来源:

<!doctype html>
<html lang="en">
<head>
<title>JFrame Demo</title>
<style type="text/css">
  body {width:800px; min-height:400px;}
  * {float:left; margin:0; color:inherit;}
  #input {width:600px;}
  #button {margin-left:10px; background:#AAA; padding:2px 5px; border:1px solid black;}
  #textarea {width:700px; height:300px; resize:none; white-space:nowrap;}
</style>
<script type="text/javascript">
  function myAction() {
    var inputElement = document.getElementById('input');
    var outputElement = document.getElementById('textarea'); 
    outputElement.innerHTML = myMethod(inputElement.value);

    function myMethod(str) {
      // Do something more useful than this:
      return "You wrote: "+str;
    }
  }
</script>
</head>
<body>
  <input id="input" />
  <a href="#" onclick="myAction()"><p id="button">Enter</p></a>
  <br>
  <textarea id="textarea" readonly spellcheck="false" warp="off"></textarea>
</body>
</html>

我看过一些例子,他们给 JFrame 的构造函数一个 Component 作为参数来选择布局,但我不明白它是如何工作的。
编辑:我不会接受这 3 个元素的嵌套解决方案。

最佳答案

好的,我知道这不是你想要的答案,抱歉。但我只是想告诉你我的评论是什么意思以及如何去做。这不是一个直接的答案,但也许你会在看到它后改变主意 :P(尤其是关于 setPreferredSize(),因为这不是真正推荐的做法)。这将适用于几乎任何尺寸的帧:

代码:

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MainClass {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainClass();
            }
        });
    }

    public MainClass() {

        JFrame frame = new JFrame("JFrame Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea outputarea = new JTextArea();
        outputarea.setBorder(new LineBorder(Color.GRAY));
        outputarea.setWrapStyleWord(true);
        outputarea.setLineWrap(true);
        outputarea.setEditable(false);

        JTextField field = new JTextField();
        field.setBorder(new CompoundBorder(new EmptyBorder(0, 0, 3, 0), field.getBorder()));

        JButton button = new JButton("Enter");
        button.setBackground(Color.LIGHT_GRAY);
        button.setFocusPainted(false);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                outputarea.setText("You wrote: " + field.getText());
            }
        });

        // This panel is just needed in order to set a border for the button
        // without losing it's margin.
        BorderPanel buttonPanel = new BorderPanel();
        buttonPanel.setBorder(new CompoundBorder(new EmptyBorder(0, 10, 0, 30), new LineBorder(Color.BLACK)));
        buttonPanel.add(button);

        BorderPanel northPanel = new BorderPanel();
        northPanel.add(field);
        northPanel.add(buttonPanel, BorderLayout.EAST);

        BorderPanel mainPanel = new BorderPanel();
        mainPanel.add(outputarea);
        mainPanel.add(northPanel, BorderLayout.NORTH);

        frame.setContentPane(mainPanel);
        frame.setSize(600, 300);
        frame.setVisible(true);

    }

    public class BorderPanel extends JPanel {

        public BorderPanel() {
            setLayout(new BorderLayout());
            setBackground(Color.WHITE);
        }

    }

}

最终结果:

enter image description here

关于java - JFrame : How to make a simple layout with linebreak-like behavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33505020/

相关文章:

java - 如何解析类似 INI/JSON 的非标准格式的文件?

java - 有什么方法我们也可以使用 wedriver 截取整个页面的屏幕截图,包括向下(滚动条)中的页面

java - 检查 GWT MaterialCollapsible 对象是否折叠

java - 一个 ButtonListener 可以用于多个按钮吗?

html - CSS Flexbox 右对齐响应式

html - 在不是全宽的可变大小容器内居中?

java - 如何使用jsoup从HTML解析两个表?

java - 运行 java 应用程序后创建并显示标签

java - 如何解析Java Swing文本框中输入的磁条卡数据?

php - 在 HTML 表格设计中,根据输入框按高度动态增大/缩小文本框