2013-04-18 1 views
1

Существует некоторая проблема в GroupLayout из следующего кода, Пожалуйста, помогите мне понять этоGroupLayout немного перепутались

Я также загрузил выходной файл, я не уверен, если их какие-либо проблемы с выравниванием. Кингли посмотри и помоги мне разобраться.

enter image description here

package javaapplication1; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.net.InetAddress; 
import javax.swing.*; 
import javax.swing.GroupLayout.Alignment; 
import javax.swing.JCheckBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class Progress extends JFrame implements ActionListener { 

    static JFrame frame; 
    public JLabel ClientIP; 
    JTextField ip; 
    JLabel ClientPassword; 
    JTextField pass; 
    JLabel Videoname; 
    JTextField vname; 
    JLabel perccomplete; 
    JTextField percent; 
    JLabel PacketsSent; 
    JTextField pacsent; 
    JLabel Connectiontype; 
    JTextField conntype; 
    JLabel noofvideossent; 
    JTextField videosend; 
    JButton disconnect; 
    JButton refresh; 
    JButton ok; 

    public Progress() { 

     ClientIP = new JLabel("Client's IP:"); 
     ClientPassword = new JLabel("Clients Password:"); 
     Videoname = new JLabel("Video being Transfered:"); 
     perccomplete = new JLabel("% of transfer Complete:"); 
     PacketsSent = new JLabel("No of Packets sent:"); 
     Connectiontype = new JLabel("Connection Type:"); 
     noofvideossent = new JLabel("No of Videos Sent:"); 


     ip = new JTextField(Ipad); 
     ip.setColumns(20); 
     pass = new JTextField(Ipass); 
     pass.setColumns(20); 
     vname = new JTextField(Iselvid); 
     vname.setColumns(20); 
     percent = new JTextField("10%"); 
     percent.setColumns(20); 
     pacsent = new JTextField(String.valueOf(RTSPSeqNb)); 
     pacsent.setColumns(20); 
     String c; 
     if (clientConnected == true) { 
      c = "TCP"; 
     } else { 
      c = "not Connected"; 
     } 
     conntype = new JTextField(c); 
     conntype.setColumns(20); 
     videosend = new JTextField(String.valueOf(videocount)); 
     videosend.setColumns(20); 

     //Tell accessibility tools about label/textfield pairs. 
     ClientIP.setLabelFor(ip); 
     ClientPassword.setLabelFor(pass); 
     Videoname.setLabelFor(vname); 
     perccomplete.setLabelFor(percent); 
     PacketsSent.setLabelFor(pacsent); 
     Connectiontype.setLabelFor(conntype); 
     noofvideossent.setLabelFor(videosend); 

     //Lay out the labels in a panel. 
     GroupLayout layout = new GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 

     // Turn on automatically creating gaps between components that touch 
     // the edge of the container and the container. 
     layout.setAutoCreateContainerGaps(true); 

     GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); 
     hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING). 
       addComponent(ClientIP).addComponent(ClientPassword).addComponent(Videoname).addComponent(perccomplete).addComponent(PacketsSent).addComponent(Connectiontype).addComponent(noofvideossent)); 

     hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING). 
       addComponent(ip).addComponent(pass).addComponent(vname).addComponent(percent). 
       addComponent(pacsent).addComponent(conntype).addComponent(videosend)); 

     layout.setHorizontalGroup(hGroup); 


     GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); 

     vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientIP)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientPassword)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Videoname)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(perccomplete)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(PacketsSent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Connectiontype)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(noofvideossent)); 

     vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ip)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(pass)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(vname)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(percent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(pacsent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(conntype)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(videosend)); 

     layout.setVerticalGroup(vGroup); 




//  JPanel buttonPane = new JPanel(new GridLayout(0,1)); 
//  disconnect = new JButton("Disconnect Client"); 
//  disconnect.setActionCommand("Disconnect"); 
//  disconnect.addActionListener(this); 
//  refresh = new JButton("Refresh Details"); 
//  refresh.setActionCommand("refresh"); 
//  refresh.addActionListener(this); 
//  ok = new JButton("OK"); 
//  ok.setActionCommand("ok"); 
//  ok.addActionListener(this); 
//  buttonPane.add(refresh); 
//  buttonPane.add(disconnect); 
//  buttonPane.add(ok); 
//  add(buttonPane, BorderLayout.AFTER_LAST_LINE); 
     setTitle("Find"); 
     pack(); 
    } 

    private static void createAndShowGUI() { 
     //Create and set up the window. 
     //frame = new JFrame("Connected Client's Details"); 

     //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     new Progress().setVisible(true); 
     //Add contents to the window. 
//  frame.add(new Progress()); 
//  //Display the window. 
//  frame.pack(); 
//  frame.setVisible(true); 
    } 

    public static void main(String args[]) { 
     //Schedule a job for the event dispatch thread: 
     //creating and showing this application's GUI. 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       //Turn off metal's use of bold fonts 
       UIManager.put("swing.boldMetal", Boolean.FALSE); 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if ("Disconnect".equalsIgnoreCase(e.getActionCommand())) { 
      ClientIPAddr = null; 
      JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green."); 
     } 
     if ("refresh".equalsIgnoreCase(e.getActionCommand())) { 
      String Ipad = null, Ipass, Iselvid; 
      if (ClientIPAddr == null || ClientIPAddr.equals("")) { 
       Ipad = "Not Connected"; 
      } else { 
       Ipad = ClientIPAddr.toString(); 
      } 
      if (vFilePassword == null || vFilePassword.equals("")) { 
       Ipass = "No Password"; 
      } else { 
       Ipass = vFilePassword; 
      } 
      if (selected_video == null || selected_video.equals("")) { 
       Iselvid = "Not Selected"; 
      } else { 
       Iselvid = selected_video; 
      } 
      ip.setText(Ipad); 
      pass.setText(Ipass); 
      vname.setText(Iselvid); 
      percent.setText("10%"); 
      pacsent.setText(String.valueOf(RTSPSeqNb)); 
      String c; 
      if (clientConnected == true) { 
       c = "TCP"; 
      } else { 
       c = "not Connected"; 
      } 
      conntype.setText(c); 
      videosend.setText(String.valueOf(videocount)); 
     } 
     if ("ok".equalsIgnoreCase(e.getActionCommand())) { 
      frame.dispose(); 
     } 

    } 
} 
+0

Смотри также это предыдущий [Q & A] (http://stackoverflow.com/q/16071196/ 230513). – trashgod

ответ

0

По моему опыту, GroupLayout лучше всего использовать с GUI Builder, например, как один из NetBeans, как он был построен специально для этой цели. Так что просто исправьте макет с помощью своего GUI-застройщика.

Если вы хотите манипулировать макетом «вручную», для этой задачи легче манипулировать менеджерами макетов, ИМХО.

+0

и очень похожее уведомление в учебнике Oracle – mKorbel

+0

Ну, это правда, что 'GroupLayout' хорошо подходит для потребностей GUI-конструктора. Но на самом деле, «GroupLayout» отлично подходит для написания от руки. Код, который вы пишете вручную, обычно легко писать, компактно и не так сложно поддерживать впоследствии. Кроме того, существует множество конструктов, которые вы можете выразить с помощью API 'GroupLayout', который просто невозможно выразить с помощью построителя GUI. – barjak

+0

@barjak complex layoutManager часто является вопросом вкуса - и GroupLayout - это не то, что я лично считаю со вкусом :-) Что касается обслуживания: предположим, вы хотите добавить еще пару ярлыков/текста. Это потребует _change_ кода макета в трех местоположениях (добавление comps отдельно к параллельной группе в группе horizontalGroup плюс добавление новой группы, содержащей как в вертикальной группе). Мое ожидание простой в обслуживании макете было бы вовсе не касаться макета, но просто добавьте компоненты в панель и сделайте это (как и в MigLayout, f.i.) – kleopatra

3

GroupLayout - это макет, основанный на ограничениях. Основным принципом является определение ограничений позиционирования между компонентами по оси x и y независимо друг от друга.

Существует только два ограничения: либо компоненты находятся в последовательности, либо они параллельны.

В вашем случае, ваш макет просто:

  • на оси х, есть все метки параллельно, и все текстовые поля параллельно.
  • на оси у, есть группы [этикетки, а затем текстовое поле], все параллельно

Код для этого является следующее:

import javax.swing.GroupLayout; 
import javax.swing.GroupLayout.Alignment; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class Progress extends JPanel { 

    private JLabel ClientIP; 
    private JTextField ip; 
    private JLabel ClientPassword; 
    private JTextField pass; 
    private JLabel Videoname; 
    private JTextField vname; 
    private JLabel perccomplete; 
    private JTextField percent; 
    private JLabel PacketsSent; 
    private JTextField pacsent; 
    private JLabel Connectiontype; 
    private JTextField conntype; 
    private JLabel noofvideossent; 
    private JTextField videosend; 

    public Progress() { 

     ClientIP = new JLabel("Client's IP:"); 
     ClientPassword = new JLabel("Clients Password:"); 
     Videoname = new JLabel("Video being Transfered:"); 
     perccomplete = new JLabel("% of transfer Complete:"); 
     PacketsSent = new JLabel("No of Packets sent:"); 
     Connectiontype = new JLabel("Connection Type:"); 
     noofvideossent = new JLabel("No of Videos Sent:"); 


     ip = new JTextField(); 
     pass = new JTextField(); 
     vname = new JTextField(); 
     percent = new JTextField(); 
     pacsent = new JTextField(); 
     conntype = new JTextField(); 
     videosend = new JTextField(); 

     ip.setColumns(20); 
     pass.setColumns(20); 
     vname.setColumns(20); 
     percent.setColumns(20); 
     pacsent.setColumns(20); 
     conntype.setColumns(20); 
     videosend.setColumns(20); 

     //Tell accessibility tools about label/textfield pairs. 
     ClientIP.setLabelFor(ip); 
     ClientPassword.setLabelFor(pass); 
     Videoname.setLabelFor(vname); 
     perccomplete.setLabelFor(percent); 
     PacketsSent.setLabelFor(pacsent); 
     Connectiontype.setLabelFor(conntype); 
     noofvideossent.setLabelFor(videosend); 

     GroupLayout layout = new GroupLayout(this); 
     setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 

     layout.setHorizontalGroup(
       layout.createSequentialGroup() 
        .addGroup(layout.createParallelGroup(Alignment.LEADING) 
         .addComponent(ClientIP) 
         .addComponent(ClientPassword) 
         .addComponent(Videoname) 
         .addComponent(perccomplete) 
         .addComponent(PacketsSent) 
         .addComponent(Connectiontype) 
         .addComponent(noofvideossent)) 
        .addGroup(layout.createParallelGroup(Alignment.LEADING) 
         .addComponent(ip) 
         .addComponent(pass) 
         .addComponent(vname) 
         .addComponent(percent) 
         .addComponent(pacsent) 
         .addComponent(conntype) 
         .addComponent(videosend))); 

     layout.setVerticalGroup(
       layout.createSequentialGroup() 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(ClientIP) 
         .addComponent(ip)) 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(ClientPassword) 
         .addComponent(pass)) 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(Videoname) 
         .addComponent(vname)) 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(perccomplete) 
         .addComponent(percent)) 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(PacketsSent) 
         .addComponent(pacsent)) 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(Connectiontype) 
         .addComponent(conntype)) 
        .addGroup(layout.createParallelGroup(Alignment.BASELINE) 
         .addComponent(noofvideossent) 
         .addComponent(videosend))); 
    } 


    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       UIManager.put("swing.boldMetal", Boolean.FALSE); 
       JFrame f = new JFrame("test frame"); 
       f.setContentPane(new Progress()); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setTitle("Find"); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 

} 

GroupLayout относительно легко понять, , когда код имеет правильный отступ. Я заменил Alignement.LEADING на Alignement.BASELINE, чтобы выровнять по базовой линии (текст меток и текстовых полей находится в одной строке).

+0

+1 для удобства чтения; см. также этот [пример] (http://stackoverflow.com/a/14858272/230513), который добавляет помеченные поля в цикле. – trashgod

+0

barjak's [sscce] (http://sscce.org/) компилируется и выполняется правильно; ваше обновление не компилируется. Я предлагаю отменить изменения до тех пор, пока он не будет работать снова, и сосредоточьтесь на первом изменении, чтобы разорвать ваше следующее обновление. – trashgod

0

Большое спасибо за помощь. Я изменил код следующим образом, и она работала .. Выравнивание было нормально, но их была проблема в вертикальной оси ..

GroupLayout layout = new GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 

     // Turn on automatically creating gaps between components that touch 
     // the edge of the container and the container. 
     layout.setAutoCreateContainerGaps(true); 

     GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); 
     hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING). 
       addComponent(ClientIP).addComponent(ClientPassword).addComponent(Videoname).addComponent(perccomplete).addComponent(PacketsSent).addComponent(Connectiontype).addComponent(noofvideossent)); 

     hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING). 
       addComponent(ip).addComponent(pass).addComponent(vname).addComponent(percent). 
       addComponent(pacsent).addComponent(conntype).addComponent(videosend).addComponent(disconnect).addComponent(refresh).addComponent(ok)); 
     layout.setHorizontalGroup(hGroup); 


     GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); 

     vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientIP).addComponent(ip)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientPassword).addComponent(pass)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Videoname).addComponent(vname)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(perccomplete).addComponent(percent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(PacketsSent).addComponent(pacsent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Connectiontype).addComponent(conntype)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(noofvideossent).addComponent(videosend)); 

     vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(disconnect)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(refresh)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ok)); 
     layout.setVerticalGroup(vGroup); 
+0

Обновите свой вопрос новым кодом; [* sscce *] (http://sscce.org/) и [* screenshot *] (http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to -illustrate-a-post) обычно хорошо воспринимаются. – trashgod

+0

Я изменил вопрос ... – Learner

+0

Этот ответ не может быть удален сейчас. – trashgod

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

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