2013-08-03 3 views
1

У меня проблема с текстовыми полями и компонентами со списком, которые установлены на восточной панели. По какой-то причине, когда я добавил компоновку ящика, чтобы упорядочить их по Y, некоторые из перечисленных выше компонентов не выравнивают и масштабируют размер с помощью кнопок, как и должно быть.Swing App - настройка положения компонентов восточной панели

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.JTextField; 

/** 
* 
* @author Isaac 
*/ 
public class Test2 extends JFrame { 

    private JButton addNewColumnButton; 
    private JButton calculateColumnButton; 
    private JButton resultButton; 

    private JLabel textLabel; 

    private JTextField columnField; 
    private JTextField resultField;    

    private JComboBox columnListCB; 
    private JTable table; 

    private String[] tableCols = {"Fisrt Column", "Second Column", "Third Column", "", "", "", "", ""}; 
    private Object[][] tableRows = { 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null}, 
      {true, null, null, null, null, null, null, null} 
    }; 

    public Test2() { 
     this.setSize(new Dimension(600, 280)); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLocationRelativeTo(null); 
     this.setResizable(false); 

     this.init(); 
     this.add(getUIPanel()); 

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

    private JPanel getUIPanel() { 
     JPanel panel = new JPanel(new BorderLayout()); 
     panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     panel.setBackground(Color.blue); 

     JPanel center = new JPanel(); 
     center.add(table); 

     JPanel eastPanel = new JPanel(); 
     eastPanel.setBackground(Color.MAGENTA); 
      Box eastPanelBox = Box.createVerticalBox(); 
      eastPanelBox.add(addNewColumnButton); 
      eastPanelBox.add(Box.createVerticalStrut(14)); 
      eastPanelBox.add(columnField); 
      eastPanelBox.add(Box.createVerticalStrut(5)); 
      eastPanelBox.add(columnListCB); 
      eastPanelBox.add(Box.createVerticalStrut(5)); 
      eastPanelBox.add(calculateColumnButton); 
     eastPanel.add(eastPanelBox); 

     JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 
     southPanel.setBackground(Color.green); 
      southPanel.add(resultButton); 
      southPanel.add(textLabel); 
      southPanel.add(resultField); 

     panel.add(center, BorderLayout.WEST); 
     panel.add(southPanel, BorderLayout.SOUTH); 
     panel.add(eastPanel, BorderLayout.EAST); 
     return panel; 
    } 

    private void init() { 
     final int COMPONENT_WIDTH = 130; 
     final int COMPONENT_HEIGHT = 25; 

     table = new JTable(tableRows, tableCols); 

     addNewColumnButton = new JButton("New Column"); 
     addNewColumnButton.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT)); 

     columnField = new JTextField(); 
     columnField.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT)); 

     columnListCB = new JComboBox(tableCols); 
     columnListCB.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT)); 

     calculateColumnButton = new JButton("Calculate Column"); 
     calculateColumnButton.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT)); 

     resultButton = new JButton("Calculate"); 
     calculateColumnButton.setPreferredSize(new Dimension(COMPONENT_WIDTH, COMPONENT_HEIGHT)); 

     textLabel = new JLabel("Result:"); 

     resultField = new JTextField(); 
     resultField.setPreferredSize(new Dimension(COMPONENT_WIDTH/2, COMPONENT_HEIGHT)); 
    } 

    public static void main(String[] args) { 
     new Test2(); 
    } 
} 
+1

Что ваш вопрос? –

+1

Я в замешательстве. 1. Вы говорите о выравнивании ** внутри ** 'eastPanel'? 2. Где вы добавляете «BoxLayout» и в какой контейнер? –

+1

Почему бы просто не использовать GridLayout для вашего восточного JPanel? –

ответ

1

Некоторые проблемы возникают в вашем примере:

  • «In general, все компоненты, управляемые сверху донизу BoxLayout объект должен иметь такое же выравнивание X».

  • Укажите начальный размер JTextField с использованием соответствующего конструктора.

  • Не используйте setPreferredSize(), если вы действительно хотите переопределить getPreferredSize().

  • Invoke pack() и затем установить местоположение & видимость.

  • Использовать initial threads правильно.

  • Не обязательно удлинять top-level component, например. JFrame.

  • Избегайте этого pitfall на контейнере без размера.

image

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 

/** 
* @author Isaac 
* @see https://stackoverflow.com/a/18037704/230513 
*/ 
public class Test2 { 

    private JButton addNewColumnButton; 
    private JButton calculateColumnButton; 
    private JButton resultButton; 
    private JLabel textLabel; 
    private JTextField columnField; 
    private JTextField resultField; 
    private JComboBox columnListCB; 
    private JTable table; 
    private String[] tableCols = { 
     "Fisrt Column", "Second Column", "Third Column" 
    }; 
    private Object[][] tableRows = { 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null}, 
     {true, null, null, null, null, null, null, null} 
    }; 

    public Test2() { 
     JFrame f = new JFrame("Test2"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(getUIPanel()); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private JPanel getUIPanel() { 
     JPanel panel = new JPanel(new BorderLayout()); 
     panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     panel.setBackground(Color.blue); 

     JPanel center = new JPanel(new GridLayout()); 
     table = new JTable(tableRows, tableCols); 
     table.setPreferredScrollableViewportSize(new Dimension(240, 120)); 
     center.add(new JScrollPane(table)); 

     JPanel eastPanel = new JPanel(); 
     eastPanel.setBackground(Color.MAGENTA); 
     Box eastPanelBox = Box.createVerticalBox(); 
     addNewColumnButton = new JButton("New Column"); 
     addNewColumnButton.setAlignmentX(Box.CENTER_ALIGNMENT); 
     eastPanelBox.add(addNewColumnButton); 
     eastPanelBox.add(Box.createVerticalStrut(14)); 
     columnField = new JTextField(); 
     columnField.setAlignmentX(Box.CENTER_ALIGNMENT); 
     eastPanelBox.add(columnField); 
     eastPanelBox.add(Box.createVerticalStrut(5)); 
     columnListCB = new JComboBox(tableCols); 
     columnListCB.setAlignmentX(Box.CENTER_ALIGNMENT); 
     eastPanelBox.add(columnListCB); 
     eastPanelBox.add(Box.createVerticalStrut(5)); 
     calculateColumnButton = new JButton("Calculate Column"); 
     calculateColumnButton.setAlignmentX(Box.CENTER_ALIGNMENT); 
     eastPanelBox.add(calculateColumnButton); 
     eastPanel.add(eastPanelBox); 

     JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 
     southPanel.setBackground(Color.green); 
     resultButton = new JButton("Calculate"); 
     southPanel.add(resultButton); 
     textLabel = new JLabel("Result:"); 
     southPanel.add(textLabel); 
     resultField = new JTextField(10); 
     southPanel.add(resultField); 

     panel.add(center, BorderLayout.WEST); 
     panel.add(southPanel, BorderLayout.SOUTH); 
     panel.add(eastPanel, BorderLayout.EAST); 
     return panel; 
    } 

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

Вау ... так много вопросов. Однако, спасибо вам большое. –

+0

Эй, извините, я забыл еще одну вещь, чтобы спросить, как я могу перемещать компоненты в линию со столом без нарушения разрыва между компонентами 5px? Посмотрите скриншот здесь, если я не понял. Http://imageshack.us/photo/my-images/89/yl8o.jpg/ –

+0

Трудно сказать; это может быть новый вопрос; проверьте [вложенные макеты] (http://stackoverflow.com/a/5630271/230513). – trashgod

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

  • Нет связанных вопросов^_^