2016-01-12 3 views
0

Я работаю над небольшим проектом GUI, который строит книжный ясли, чтобы управлять книгой. В моем макете я хочу, чтобы textArea отображал информацию о моей книге, текст JLabel под моим textArea и JTextArea для ввода информации о том же столбце JLabel и 1 строки рядом с Label. Однако, когда я запускаю свою программу, textArea и Label полностью покрывают мои textArea.JTextField укладывается поверх JTextArea

Как исправить эту проблему. Благодаря!!

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

public class Design extends JFrame { 

    JButton button1; 
    JTextArea outputArea; 
    JLabel stockLabel, bookPriceLabel; 
    JTextField stockTextField, priceTextField; 
    JPanel panel; 
    GridBagConstraints gc; 

    public Design(){ 
     super("Book Info"); 

     gc = new GridBagConstraints(); 
     panel = new JPanel(); 
     outputArea = new JTextArea(20, 50); 
     stockLabel = new JLabel ("Books In Stock"); 
     bookPriceLabel = new JLabel("Book Price"); 
     stockTextField = new JTextField(10); 
     button1 = new JButton ("button1"); 

     panel.setLayout(new GridBagLayout()); 
     panel.setSize(600, 600); 

     gc.anchor = GridBagConstraints.NORTHWEST; 
     gc.weightx = 1; 
     gc.weighty = 1; 
     panel.add(outputArea, gc); 

     gc.gridx = 2; 
     gc.gridy = 2; 
     panel.add(stockLabel, gc); 

     gc.gridx = 3; 
     gc.gridy = 2; 
     panel.add(stockTextField, gc); 

     this.getContentPane().add(panel); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(600,600); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 

    public static void main (String args[]){ 
     Design frame = new Design(); 
    } 
} 

ответ

3

Вы могли бы применить gridWidth ограничение на JTextArea, который позволил бы ей на несколько колонок.

Помните, GridBagLayout по-прежнему основывается на концепции сетки (строки и столбцы), но обеспечивает большую гибкость, чтобы настроить, как заполнять компоненты и диапазон через вне этой сетки

Может быть что-то вроде ...

Layout

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
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 Design extends JFrame { 

    JButton button1; 
    JTextArea outputArea; 
    JLabel stockLabel, bookPriceLabel; 
    JTextField stockTextField, priceTextField; 
    JPanel panel; 
    GridBagConstraints gc; 

    public Design() { 
     super("Book Info"); 

     gc = new GridBagConstraints(); 
     panel = new JPanel(); 
     outputArea = new JTextArea(20, 50); 
     stockLabel = new JLabel("Books In Stock"); 
     bookPriceLabel = new JLabel("Book Price"); 
     stockTextField = new JTextField(10); 
     button1 = new JButton("button1"); 

     panel.setLayout(new GridBagLayout()); 

     gc.anchor = GridBagConstraints.NORTHWEST; 
     gc.gridx = 0; 
     gc.gridy = 0; 
     gc.weightx = 1; 
     gc.weighty = 1; 
     gc.gridwidth = GridBagConstraints.REMAINDER; 
     panel.add(new JScrollPane(outputArea), gc); 

     gc.weightx = 0; 
     gc.weighty = 0; 
     gc.anchor = GridBagConstraints.WEST; 
     gc.gridwidth = 1; 
     gc.gridx = 0; 
     gc.gridy = 2; 
     panel.add(stockLabel, gc); 

     gc.gridx++; 
     gc.gridy = 2; 
     panel.add(stockTextField, gc); 

     this.getContentPane().add(panel); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       Design frame = new Design(); 
      } 
     }); 
    } 
} 

См How to Use GridBagLayout для более подробной информации

Некоторые общие обратной связи:

  • Там нет смысла в вызове setSize на компонент, который будет добавлен в контейнер, который с помощью менеджера компоновки, то действие будет просто игнорироваться и менеджер компоновки будет вызывать setSize с тем, что он хочет использовать
  • JTextArea действительно должны содержаться в JScrollPane, вы получите некоторые странные результаты, если вы не (это нужно будет расти, поскольку текст занимает больше места)
  • Предпочитают JFrame#pack над JFrame#setSize, это займет учитывайте границы рамки, обертывая рамку вокруг содержимого
  • Вам действительно следует избегать распространения непосредственно из контейнеров верхнего уровня, таких как JFrame, кроме того, что вы блокируете вас в одном случае, вы действительно не добавляете никаких новых функций в фрейм. Вместо этого начните с чего-то вроде JPanel, создайте на нем основной пользовательский интерфейс, а затем, когда вам нужно, добавьте это к тому, что когда-либо понадобилось вам.
+0

Хорошо, я получаю большую часть того, что вы говорите, но почему менеджер макета изменит размер моей JTextArea на действительно маленькую коробку, если я установил сторону моего JFrame? Как и у меня в моем коде "setSize (600 600);" – Joefa

+0

Потому что это то, что менеджеры макетов (могут) делать – MadProgrammer

+0

Хорошо, спасибо! – Joefa