2015-11-02 5 views
0

Из моего кода я ожидаю, что моя JTextArea заполнить верхний левый край показано ниже: enter image description hereJTextArea обыкновение заполнить панель с GridBagConstraints

Но как вы можете видеть его взятие крошечный разрез в середине. Я использую GridBagConstraints на панели, которая содержит компоненты.

Существует основной класс, который вызывает класс под названием frame. Этот класс создает JFrame и задает размер, а также другие вещи. Затем он вызывается из MainFrame.java, который расширил jframe, который создает 3 панели и устанавливает их макет. это видно ниже

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

public class MainFrame extends JFrame 
{ 
    private Panel1 storyPanel; 
    private Panel2 statsPanel; 
    private Panel3 commandsPanel; 

    public MainFrame(String title) 
    { 
     super(title); 

     // Setting Layout 
     GridBagConstraints gbc = new GridBagConstraints(); 

     storyPanel = new Panel1(); 
     storyPanel.setLayout(new GridBagLayout()); 
     statsPanel = new Panel2(); 
     commandsPanel = new Panel3(); 

     Container p = getContentPane(); 

     p.add(storyPanel, BorderLayout.WEST); 
     p.add(statsPanel, BorderLayout.EAST); 
     p.add(commandsPanel, BorderLayout.SOUTH); 

    } 
} 

Панель в вопросах - Panel1 или storyPanel. Я поставил макет и код вызывает Panel1.java, как показано ниже:

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

public class Panel1 extends JPanel 
{ 
    public Panel1() 
    { 
     GridBagConstraints gbc = new GridBagConstraints(); 

     //Set size of Panel1 
     int xsizeP1 = (Frame.xsize()/2); 
     int ysizeP1 = (Frame.ysize()/3 * 2); 
     setPreferredSize(new Dimension(xsizeP1, ysizeP1)); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 

     //Adding JTextArea and adding settings to it 
     JTextArea storyLine = new JTextArea("  test  "); 
     storyLine.setLineWrap(true); 
     storyLine.setWrapStyleWord(true); 
     storyLine.setEditable(false); 


     //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar 
     JScrollPane scroll = new JScrollPane(storyLine); 
     scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

     //GridBagConstraints setup for components 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.fill = GridBagConstraints.VERTICAL; 
     add(scroll, gbc); 
    } 
} 

Я не понимаю, почему мой gbc.fill разве что делает JTextArea заполнить верхнюю левую границу экрана выстрела.

Заранее спасибо за любой ответ в

-Tom T


изменение раскладки расположение границ

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

public class Panel1 extends JPanel 
{ 
    public Panel1() 
    { 
     //GridBagConstraints gbc = new GridBagConstraints(); 
     //gbc.weightx = 0.1; 
     //gbc.weighty = 0.1; 
     BorderLayout b = new BorderLayout(); 

     //Set size of Panel1 
     int xsizeP1 = (Frame.xsize()/2); 
     int ysizeP1 = (Frame.ysize()/3 * 2); 
     setPreferredSize(new Dimension(xsizeP1, ysizeP1)); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 

     //Adding JTextArea and adding settings to it 
     JTextArea storyLine = new JTextArea("  test  "); 
     storyLine.setLineWrap(true); 
     storyLine.setWrapStyleWord(true); 
     storyLine.setEditable(false); 


     //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar 
     JScrollPane scroll = new JScrollPane(storyLine); 
     scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

    //gbc.gridx = 0; 
    //gbc.gridy = 0; 
     //gbc.weightx = 1; 
     //gbc.weighty = 1; 
     //gbc.fill = GridBagConstraints.BOTH; 
     add(scroll, b.CENTER); 
    } 
} 
+0

Не беспокойтесь о настройке xsize и ysize кода для тех, что находится в Frame.java, который не нужен для вопроса. Если требуется какая-либо другая информация, просто спросите. –

+1

Не устанавливайте макет storyPanel снова. Используйте GridBagConstaints.BOTH для ограничения заполнения и используйте weightx и weighty, чтобы указать количество оставшегося пространства, которое должен занимать компонент.На основе вашего кода было бы проще использовать BorderLayout вместо – MadProgrammer

+0

Я попробовал макет границы и установил его в центр, ожидая его изменения размера, но это тоже не удалось, я попробую ваши предложения, спасибо, –

ответ

3
  1. Не установлен макет storyPanel, так как это содержимое уже добавлено и выложено, поэтому при смене диспетчера компоновки будут отменены любые свойства, которые вы применили. Вместо этого установите компоновку в конструкторе Panel1, прежде чем добавлять какие-либо компоненты.
  2. Используйте GridBagConstraints.BOTH для категории fill. Свойство fill может только иметь одно определенное значение
  3. Использование weightx и weighty, чтобы указать, сколько свободного пространства компонент должен использовать

Например ...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class MainFrame extends JFrame { 

    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(); 
       } 

       JFrame frame = new MainFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private Panel1 storyPanel; 
// private Panel2 statsPanel; 
// private Panel3 commandsPanel; 

    public MainFrame(String title) { 
     super(title); 

     storyPanel = new Panel1(); 

     Container p = getContentPane(); 

     p.add(storyPanel, BorderLayout.WEST); 
     p.add(new JLabel("East"), BorderLayout.EAST); 
     p.add(new JLabel("South"), BorderLayout.SOUTH); 

    } 

    public class Panel1 extends JPanel { 

     public Panel1() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 

      //Set size of Panel1 
      setBorder(BorderFactory.createLineBorder(Color.black)); 

      //Adding JTextArea and adding settings to it 
      JTextArea storyLine = new JTextArea(20, 20); 
      storyLine.setLineWrap(true); 
      storyLine.setWrapStyleWord(true); 
      storyLine.setEditable(false); 

      //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar 
      JScrollPane scroll = new JScrollPane(storyLine); 
      scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
      scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

      //GridBagConstraints setup for components 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.fill = GridBagConstraints.BOTH; 
      gbc.weightx = 1; 
      gbc.weighty = 1; 
      add(scroll, gbc); 
     } 
    } 
} 

Сказав все, что , BorderLayout будет проще

public class Panel1 extends JPanel { 

    public Panel1() { 
     setLayout(new BorderLayout()); 

     //Set size of Panel1 
     setBorder(BorderFactory.createLineBorder(Color.black)); 

     //Adding JTextArea and adding settings to it 
     JTextArea storyLine = new JTextArea(20, 20); 
     storyLine.setLineWrap(true); 
     storyLine.setWrapStyleWord(true); 
     storyLine.setEditable(false); 

     //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar 
     JScrollPane scroll = new JScrollPane(storyLine); 
     scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

     add(scroll); 
    } 
} 

я попытался макет границы и установить его в центр ожидает его размер, но это не удалось, а

бы предположить, что вы делаете фундаментальную ошибку некоторых, где, как это работает для меня. Помните, установите макет ДО добавьте какие-либо компоненты в контейнер

+0

Большое спасибо, он отлично работал, и ваш ответ был хорошо структурирован и полезен, так как он помог мне понять, а также устранить проблему. Я также изменил формат границы, проблема заключалась в том, что я забыл установить макет и просто использовал «BorderLayout b = new BorderLayout();« Спасибо за всю помощь –