2012-12-27 27 views
3

我写了简单的java应用程序。一个包含3个元素的窗口(JFrame ramka):JButton,JComboBox和容器(包含JList)。 我想重新排列这些元素的位置,并导致问题。我想使用GridBagLayout,但是当我这样做时,我的容器消失了(或者它是1px大--.-),setSize对JComboBox也可以正常工作。而当我不使用任何布局时,显示带有JList的容器,但调整JComboBox的大小并不起作用,并且所有内容都重叠在一起......通常它看起来像......它并不是全部。GridBagLayout,正在消失JList

这里来了我的问题:如何,以及什么样的布局用于重新组织我的成员和JFrame的位置? 我使用NetBeans 7.2

package layouttest; 

import java.awt.*; 
import javax.swing.*; 
import javax.swing.JList; 
import java.util.ArrayList; 
import java.awt.*; 
import java.awt.GridBagLayout; 
import java.awt.event.*; 
import javax.swing.*; 

public class Layouttest { 
    public static void main(String[] args) { 
     JFrame ramka = new JFrame(); 
     //ramka.setLayout(new GridLayout(4, 3)); 
     //ramka.setLayout(new GridBagLayout()); 
     String [] test = {"cos", "cos2", "cos3", "cos4", "cos5", "cos6", "cos7", "cos8", "cos9","cos10", "cos11", "cos12"}; 
     ArrayList<String> myList = new ArrayList<String>(); 
     myList.add("cos"); 
     myList.add("cos2"); 
     myList.add("cos3"); 
     myList.add("cos4"); 
     myList.add("cos5"); 
     myList.add("cos6"); 
     myList.add("cos7"); 
     myList.add("cos8"); 
     myList.add("cos9"); 
     myList.add("cos10"); 

     GridBagConstraints ogranicznik = new GridBagConstraints(); 
     ogranicznik.insets = new Insets(5, 10, 5, 5); 
     ogranicznik.gridx = 0; 
     ogranicznik.gridy = 0; 

     Container c = new Container(); 
     ramka.setSize(500, 500); 
     c.setSize(100,100); 

     JList lista = new JList(myList.toArray()); 
     JScrollPane sp = new JScrollPane(lista); 
     JTextField txt = new JTextField("cos"); 
     c.add(sp); 

     sp.setSize(100,100); 
     lista.setSize(100, 100); 
     ramka.add(c); 
     ramka.add(txt); 

     String[] dropBoxList = {"uno", "due", "tre"}; 
     final JComboBox listaRozwijalna = new JComboBox(dropBoxList); 

     listaRozwijalna.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXX"); 
     listaRozwijalna.revalidate(); 
     listaRozwijalna.repaint(); 
     ramka.add(listaRozwijalna); 

     c.revalidate(); 
     c.repaint(); 
     ramka.revalidate(); 
     ramka.setVisible(true); 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // TODO code application logic here 
    } 
} 

@EDIT 我发现Java有与显示,同时使用布局模型容器的问题...

+0

当您在滚动窗格添加组件,您还需要设置视口。 您可以使用 sp.setViewPortView(Component)方法并尝试。 – pratikch

+0

为什么要在滚动窗格中放入JList? – ChadNC

+0

在我的理解JList默认情况下没有scrollPane。因此,为了增强JList并允许滚动,我们需要将JList添加到ScrollPane。 – pratikch

回答

1

我已经重新安排你的代码,并在GridBagLayout的增加。我不得不猜测你想如何安排你的组件。

  1. 务必确保您的Swing组件位于Event Dispatch线程中。这是主要方法的作用。

  2. 将您的GUI组件与您的数据定义分开。这使得验证您的GUI组件变得更容易。

  3. 按照它们放置在主JPanel上的顺序定义GUI组件。

  4. 总是定义一个主JPanel。这使您可以更灵活地使用哪个布局管理器来定义您的GUI。

  5. 始终使用一个或多个布局管理器。

这是我的代码版本。

import java.awt.Component; 
import java.awt.Container; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Layouttest implements Runnable { 

    protected Insets ogranicznik = new Insets(5, 10, 5, 5); 

    @Override 
    public void run() { 
     JFrame ramka = new JFrame(); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new GridBagLayout()); 

     JTextField txt = new JTextField("cos"); 

     addComponent(panel, txt, 0, 0, 1, 1, ogranicznik, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JComboBox listaRozwijalna = new JComboBox(setDropBoxValues()); 

     addComponent(panel, listaRozwijalna, 1, 0, 1, 1, ogranicznik, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JList lista = new JList(setListValues()); 
     JScrollPane sp = new JScrollPane(lista); 

     addComponent(panel, sp, 0, 1, 1, 1, ogranicznik, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     ramka.add(panel); 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // ramka.setSize(500, 500); 
     ramka.pack(); 
     ramka.setVisible(true); 
    } 

    protected void addComponent(Container container, Component component, 
      int gridx, int gridy, int gridwidth, int gridheight, Insets insets, 
      int anchor, int fill) { 
     GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, 
       gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 0); 
     container.add(component, gbc); 
    } 

    protected String[] setListValues() { 
     String[] test = { "cos", "cos2", "cos3", "cos4", "cos5", "cos6", 
       "cos7", "cos8", "cos9", "cos10", "cos11", "cos12" }; 
     return test; 
    } 

    protected String[] setDropBoxValues() { 
     String[] dropBoxList = { "uno", "due", "tre" }; 
     return dropBoxList; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Layouttest()); 
    } 
} 
0

我这么做是完全不同的方式......我只是中省略容器......

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package layouttest; 

import java.awt.*; 
import javax.swing.*; 
import javax.swing.JList; 
import java.util.ArrayList; 
import java.awt.*; 
import java.awt.GridBagLayout; 
import java.awt.event.*; 
import javax.swing.*; 


/** 
* 
* @author kula 
*/ 
public class Layouttest { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     JFrame ramka = new JFrame(); 
     //ramka.setLayout(new GridLayout(4, 3)); 
     ramka.setLayout(new GridBagLayout()); 
     String [] test = {"cos", "cos2", "cos3", "cos4", "cos5", "cos6", "cos7", "cos8", "cos9","cos10", "cos11", "cos12"}; 
     ArrayList<String> myList = new ArrayList<String>(); 
     myList.add("cos"); 
     myList.add("cos2"); 
     myList.add("cos3"); 
     myList.add("cos4"); 
     myList.add("cos5"); 
     myList.add("cos6"); 
     myList.add("cos7"); 
     myList.add("cos8"); 
     myList.add("cos9"); 
     myList.add("cos10"); 

     GridBagConstraints ogranicznik = new GridBagConstraints(); 
//ogranicznik.insets = new Insets(5, 10, 5, 5); 
ogranicznik.gridx = 0; 
ogranicznik.gridy = 2; 

     Container c = new Container(); 
     ramka.setSize(500, 500); 
    // c.setSize(100,100); 

    final JScrollPane sp = new JScrollPane(); 
    JList lista = new JList(myList.toArray()); 

    sp.getViewport().add(lista);//!!!!!!!!!!!!!!!!!! 

    //sp.removeAll(); 

    //c.add(sp); 
    //sp.setViewportView(lista); 
    // sp.setSize(100,100); 
    //lista.setSize(100, 100); 
    ramka.add(sp); 




    String[] dropBoxList = {"uno", "due", "tre"}; 
    final JComboBox listaRozwijalna = new JComboBox(dropBoxList); 


    /* listaRozwijalna.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXX"); 
    listaRozwijalna.revalidate(); 
    listaRozwijalna.repaint();*/ 
    // ramka.add(listaRozwijalna); 


    c.revalidate(); 
    c.repaint(); 
    ramka.revalidate(); 


    ramka.setVisible(true); 
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // TODO code application logic here 
    } 
}