2015-11-03 8 views
1

Я попытался создать JFrame, содержащий 3 элемента, используя Swing в Java 1.6: один - начало страницы, второй - в той же строке с некоторым интервалом слева, третий - на новой строке. Но не удалось после нескольких aproaches:
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 компонент в виде аргумента, чтобы выбрать макет, но не понял, как это работает.
EDIT: Я не буду принимать вложенное решение для этих 3 элементов.

+2

* "Я не принимаю вложенную решение этих 3-х элементов" * Могу ли я спросить, почему? Это сделает вещи намного проще (и лучше). Вам просто нужно несколько JPanels с BorderLayouts. –

+0

Что случилось с GridBagLayout или JGoodies FormsLayout? Я предпочитаю последний, поскольку его легче понять и работать. –

+0

@ LuxxMiner Единственная проблема с созданием контейнеров для 2-х элементов вместо 3 - это то, что вы хотите использовать графический интерфейс Swing как инструмент разметки при развертывании приложений, например, в HTML, где рекомендуется использовать _float: left; _ с linebreaks, чтобы сделать его гибким для будущих изменений. –

ответ

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

+0

Как бы то ни было, ты все равно сделал меня счастливым ... –

Смежные вопросы