2014-11-09 5 views
2

Я создал настройку кнопок с помощью Box.Закрыть Gps on BoxLayout

Проблема заключается в наличии пробелов между всеми кнопками.

Ниже представлена ​​версия моего кода MCVE. Я хочу добиться того, что кнопки «ONE» и «TWO» касаются бок о бок, без зазоров, а кнопки «ONE» и «ONE» касаются сверху вниз без разрыва, и для этого продолжаться на протяжении всего

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

public class Customers { 

    public static JFrame frame = new JFrame(); 

    public static void frameGui(JPanel panel, String name){    
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
      frame.setContentPane(panel);  
      frame.setSize(1200,500);   
      frame.setVisible(true); 
    } 

    public static void ScrollCustomersGui(){    
      Box box = Box.createVerticalBox();    
      box.add(customersTableHeadings(box)); 
      box.add(customersTableHeadings(box)); 
      box.add(customersTableHeadings(box)); 
      box.add(customersTableHeadings(box));    
      JScrollPane scroll = new JScrollPane(box);    
      JPanel All = new JPanel(new BorderLayout()); 
      All.add(scroll);     
      frameGui(All, "Customers"); 
     }  

    public static JPanel customersTableHeadings(Box panel){     
     Font font = new Font("Courier", Font.BOLD,12);   
     JPanel customersTable = new JPanel();   
     JButton custid = new JButton("ONE");    
     JButton surname = new JButton("TWO");   
     customersTable.add(custid); 
     customersTable.add(surname);    
     return customersTable;   
    } 
} 
+0

* "Ниже приводится версия MCVE .." * Не ** Полное ** без импорта и 'основной (String []) 'для запуска. –

+0

Пожалуйста, изучите общую номенклатуру Java (соглашения об именах - например, 'EveryWordUpperCaseClass',' firstWordLowerCaseMethod() ',' firstWordLowerCaseAttribute', если это не 'CONSTANT') и использовать ее последовательно. –

+0

@AndrewThompson Я добавил в импорте и в основном, и буду в будущем обеспечивать соответствие Java-номенклатуре –

ответ

2

BoxLayout предназначен для распределения неиспользуемого пространства между компонентами,. распорки, клей и наполнитель не изменят этого Вы можете использовать подход, предложенный here и here, чтобы изменить предпочтительный размер закрывающей панели прокрутки. В более общем плане вы можете реализовать интерфейс scrollable. Кроме того, объекты Swing GUI должны быть сконструированы и обработаны только только на event dispatch thread.

image

import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

/** @se https://stackoverflow.com/a/26829171/230513 */ 
public class Customers { 

    private static final int N = 16; 

    private void display() { 
     Box box = Box.createVerticalBox(); 
     for (int i = 0; i < N; i++) { 
      box.add(customersTableHeadings()); 
     } 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(box) { 
      int w = box.getPreferredSize().width; 
      int h = box.getPreferredSize().height; 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(9 * w/8, h/3); 
      } 
     }); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JPanel customersTableHeadings() { 
     JPanel customersTable = new JPanel(); 
     JButton custid = new JButton("ONE"); 
     JButton surname = new JButton("TWO"); 
     customersTable.add(custid); 
     customersTable.add(surname); 
     return customersTable; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      new Customers().display(); 
     }); 
    } 
} 
+0

. Обратите внимание, что вы можете комбинировать это с предложенным подходом [здесь] (http://stackoverflow.com/a/26836078/ 230513). – trashgod

1

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

Ниже приводится полный рабочий вариант кода:

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Dimension; 
import javax.swing.Box; 
import javax.swing.JApplet; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 


public class Box1 extends JApplet { 

    public void init() { 

    Box bv = Box.createVerticalBox(); 

    box(bv);  

    JScrollPane scroll = new JScrollPane(bv); 

    JPanel All = new JPanel(new BorderLayout()); 
    All.add(scroll); 

    Container cp = getContentPane(); 
    cp.add(All); 
    } 


    public static void main(String[] args) { 
    frameGui(new Box1(), "Customers"); 
    } 

    public static void frameGui (JApplet applet, String name) { 
     JFrame frame = new JFrame(); 
    frame.getContentPane().removeAll(); 
    frame.setTitle(name); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(applet); 
    frame.setSize(1200, 500); 
    applet.init(); 
    applet.start(); 
    frame.setVisible(true); 

    } 



    public static Box box(Box boxvert){ 

     for (int i = 0; i < 50; i++){ 

      JTextField one = new JTextField("ONE"); 
      one.setMaximumSize(new Dimension (150,20)); 

      JTextField two = new JTextField("TWO"); 
      two.setMaximumSize(new Dimension (150,20));    

      Box horizontalBox = Box.createHorizontalBox(); 

      horizontalBox.add(one); 
      horizontalBox.add(two);   

      boxvert.add(horizontalBox); 

     } 

     return boxvert; 

    } 



} 
+0

Качающиеся апплеты нуждаются в '' invokeLater() '] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+0

@trashgod благодарим вас за ответ. Я попытался запустить ваш пример, который, похоже, в основном такой же, как у меня, но я не смог запустить его из-за строки invokeLater(). Код, который я опубликовал, работает так, как есть, но мне было бы очень интересно понять, что такое invokeLater()? –

+0

В вашем макетном подходе нет ничего плохого, но объекты GUI Swing должны быть сконструированы и обработаны _only_ в [потоке отправки событий] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). «В апплете задача создания GUI должна запускаться из метода init с помощью' EventQueue.invokeAndWait() '." – trashgod